Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
Hyvää joulua!
Osallistu io-techin piparikakkutalokilpailuun 2025 Linkki osallistumisketjuun >>>
SER-huutokaupat hyväntekeväisyyteen käynnissä! Linkki huutokauppaan >>>
Laitatteko te yleensä "return typet":t typescriptissä funktioihin vai annateko vaan typescriptin arvioda palautus tyypit?
Toinen kysymys on se että onko typescriptissä paljon muuta hyödyllistä opeteltavaa kuin itse tyypitys?
Toinen kysymys on se että onko typescriptissä paljon muuta hyödyllistä opeteltavaa kuin itse tyypitys?
Jos (ja ilmeisesti kun) kyseessä on Windows, fiksuin tapa lienee päästää bat vapaaksi helvetistä, ja ottaa käyttöön VBScript:
1. Luo esim. "start.vbs"-nimellä tiedosto
2. Lisää tiedostoon seuraava koodi:
3. ?Koodi:CreateObject("Wscript.Shell").Run "npm run start", 0
4. Profit
(huomiona, että tässä koko komentokehote jää aukeamatta näkyviin - mikäli haluat jättää esim. virhetilanteita varten ikkunan näkyviin, vaihda nollan (0) tilalle kaksi (2))
Toimisiko@echo off
npm run start
Milläs ilveellä tuon npm run startin joka avaa erilisenn komentokehotteen auki, saa minimoitua? Nyt prompti aukeaa suoraan näytölle muun oleellisen päälle, joten pitäisi saada jätettyä auki mutta pienennettyä alapalkkiin. "
Toimisiko
start /min npm run start
Lisäät sen jo ennen ehtolausetta sanat-muuttujaan. Tai siis, lisäät inputin aina ja lopetat vasta "loppu" sanan jälkeen. Bonuksena tehtävään: Mieti vielä miten pääset ylimääräisestä välilyönnistä eroon viimeisen sanan jälkeen.Noob kyssäri pythonista mooc 2021 kurssin tehtävästä
![]()
Kuvan punaisella merkattu "loppu", miten siitä pääsee tulosteessa eroon? Tulosteen pitäisi siis syöttää nuo muuta sanat alariville kun "loppu" komento on annettu, mutta itse "loppu" ei pitäisi riville enää tulostaa. Kurssimateriaaleista ja googlesta en tuohon ratkaisua löydä.
sanat = ''
while True:
sana = input('anna sana:')
if sana != 'loppu':
if sanat != '':
sanat += ' '
sanat += sana
else:
break
print(sanat)
<?php
class ImageFilterIterator extends FilterIterator {
public function accept() {
if(preg_match('/^(?:gif|jpe?g|png)$/i',$this->getExtension())) {
return true;
} else {
return false;
}
}
}
$dir_location = dirname(__FILE__)."/cam1";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam1=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam2";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam2=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam3";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam3=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam4";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam4=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam5";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam5=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam6";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam6=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam7";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam7=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam8";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam8=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam9";
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam9=array_values($imageArr)[0][0];
$dir_location = dirname(__FILE__)."/cam10"; //
$dir = new DirectoryIterator($dir_location);
$imageArr = array();
foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){
if($fileInfo->isFile()){
$cTime = new DateTime();
$cTime->setTimestamp($fileInfo->getCTime());
$imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename();
}
}
krsort($imageArr);
$cam10=array_values($imageArr)[0][0];
header("Refresh: 300");
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Uusimmat kuvat</title>
<style>img {width: 65%;}</style>
</head>
<body>
<?php
echo '<a href="cam1"><img src="cam1/'.$cam1.'" alt="Kamera 1"/></a><br/>';
echo '<a href="cam2"><img src="cam2/'.$cam2.'" alt="Kamera 2"/></a><br/>';
echo '<a href="cam3"><img src="cam3/'.$cam3.'" alt="Kamera 3"/></a><br/>';
echo '<a href="cam4"><img src="cam4/'.$cam4.'" alt="Kamera 4"/></a><br/>';
echo '<a href="cam5"><img src="cam5/'.$cam5.'" alt="Kamera 5"/></a><br/>';
echo '<a href="cam6"><img src="cam6/'.$cam6.'" alt="Kamera 6"/></a><br/>';
echo '<a href="cam7"><img src="cam7/'.$cam7.'" alt="Kamera 7"/></a><br/>';
echo '<a href="cam8"><img src="cam8/'.$cam8.'" alt="Kamera 8"/></a><br/>';
echo '<a href="cam9"><img src="cam9/'.$cam9.'" alt="Kamera 9"/></a><br/>';
echo '<a href="cam10"><img src="cam10/'.$cam10.'" alt="Kamera 10"/></a>';
?>
</body>
</html>
Mitä tarkoittaa, että ei toimi? Antaako jotain virhettä esim?Käytössä ollut tuollainen sivu joka hakee kansioista aina uusimman kuvan, toiminut hyvin vanhassa webhotellissa, mutta uudessa ei toimi, mitä tuo vaatii toimiakseen? Jostain php asetuksistako johtuu toimimattomuus? Tuolla yritän käyttää...
Webhotellit - Bittivirta.cloud
PHP:<?php class ImageFilterIterator extends FilterIterator { public function accept() { if(preg_match('/^(?:gif|jpe?g|png)$/i',$this->getExtension())) { return true; } else { return false; } } } $dir_location = dirname(__FILE__)."/cam1"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam1=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam2"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam2=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam3"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam3=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam4"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam4=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam5"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam5=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam6"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam6=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam7"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam7=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam8"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam8=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam9"; $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam9=array_values($imageArr)[0][0]; $dir_location = dirname(__FILE__)."/cam10"; // $dir = new DirectoryIterator($dir_location); $imageArr = array(); foreach(new ImageFilterIterator(new FilesystemIterator($dir_location)) as $fileInfo){ if($fileInfo->isFile()){ $cTime = new DateTime(); $cTime->setTimestamp($fileInfo->getCTime()); $imageArr[$fileInfo->getCTime()][] = $fileInfo->getFilename(); } } krsort($imageArr); $cam10=array_values($imageArr)[0][0]; header("Refresh: 300"); ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Uusimmat kuvat</title> <style>img {width: 65%;}</style> </head> <body> <?php echo '<a href="cam1"><img src="cam1/'.$cam1.'" alt="Kamera 1"/></a><br/>'; echo '<a href="cam2"><img src="cam2/'.$cam2.'" alt="Kamera 2"/></a><br/>'; echo '<a href="cam3"><img src="cam3/'.$cam3.'" alt="Kamera 3"/></a><br/>'; echo '<a href="cam4"><img src="cam4/'.$cam4.'" alt="Kamera 4"/></a><br/>'; echo '<a href="cam5"><img src="cam5/'.$cam5.'" alt="Kamera 5"/></a><br/>'; echo '<a href="cam6"><img src="cam6/'.$cam6.'" alt="Kamera 6"/></a><br/>'; echo '<a href="cam7"><img src="cam7/'.$cam7.'" alt="Kamera 7"/></a><br/>'; echo '<a href="cam8"><img src="cam8/'.$cam8.'" alt="Kamera 8"/></a><br/>'; echo '<a href="cam9"><img src="cam9/'.$cam9.'" alt="Kamera 9"/></a><br/>'; echo '<a href="cam10"><img src="cam10/'.$cam10.'" alt="Kamera 10"/></a>'; ?> </body> </html>
"Mitä tarkoittaa, että ei toimi? Antaako jotain virhettä esim?
Tarttis ne php-virheet nähdä, siihen liittyy. webhotelli ei välttis jotain tue tai oikeuksia puuttuu tms.."
Sivu ei toimi
IP ei voi käsitellä tätä pyyntöä tällä hetkellä.
HTTP ERROR 500"
Eli ei avaa koko sivua, jos laittaa jonkin pelkän html-koodin pätkän niin se avautuu.
Logissa näkyy tuollainen, en tiedä onko siinä mitään mistä näkee?Tarttis ne php-virheet nähdä, siihen liittyy. webhotelli ei välttis jotain tue tai oikeuksia puuttuu tms..
No eikö tuo ole aika selkeä: kansiota '/vol-1/xxxxxxxxxxx/httpdocs/cam1' ei löydy.Logissa näkyy tuollainen, en tiedä onko siinä mitään mistä näkee?
AH01071: Got error 'PHP message: PHP Fatal error: Uncaught UnexpectedValueException: DirectoryIterator::__construct(/vol-1/xxxxxxxxxxx/httpdocs/cam1): Failed to open directory: No such file or directory in /vol-1/xxxxxxxxxxxxx/httpdocs/index.php:13\nStack trace:\n#0 /vol-1/xxxxxxxxxxxxx/httpdocs/index.php(13): DirectoryIterator->__construct()\n#1 {main}\n thrown in /vol-1/xxxxxxxxxxxx/httpdocs/index.php on line 13'
Juu, en nyt muista miten php noissa käyttäytyy, mut joko ei oikeuksia (oletan, että kansio on olemassa? Jos ei niin pitää luoda tietenkin) tai sit sun pitää viitata kansioon erilailla. esim. "/vol-1/xxxxxxxxxxx/httpdocs/cam1" sijaan "./cam" tai "cam"Logissa näkyy tuollainen, en tiedä onko siinä mitään mistä näkee?
AH01071: Got error 'PHP message: PHP Fatal error: Uncaught UnexpectedValueException: DirectoryIterator::__construct(/vol-1/xxxxxxxxxxx/httpdocs/cam1): Failed to open directory: No such file or directory in /vol-1/xxxxxxxxxxxxx/httpdocs/index.php:13\nStack trace:\n#0 /vol-1/xxxxxxxxxxxxx/httpdocs/index.php(13): DirectoryIterator->__construct()\n#1 {main}\n thrown in /vol-1/xxxxxxxxxxxx/httpdocs/index.php on line 13'
Sinällään ihan täysin tiomivaa ja validia koodia, mutta itseni kaltainen laiska mistään mitään välittämätön koodari olisi tuon voinut toteuttaa myös näin:Käytössä ollut tuollainen sivu joka hakee kansioista aina uusimman kuvan, toiminut hyvin vanhassa webhotellissa, mutta uudessa ei toimi, mitä tuo vaatii toimiakseen?
<?php
header("Refresh: 300");
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Uusimmat kuvat</title>
<style>img {width: 65%;}</style>
</head>
<body>
<?php
echo '<a href="cam1"><img src="'.array_pop(glob('cam1/*.jpg')).'" alt="Kamera 1"/></a><br/>';
echo '<a href="cam2"><img src="'.array_pop(glob('cam2/*.jpg')).'" alt="Kamera 2"/></a><br/>';
echo '<a href="cam3"><img src="'.array_pop(glob('cam3/*.jpg')).'" alt="Kamera 3"/></a><br/>';
echo '<a href="cam4"><img src="'.array_pop(glob('cam4/*.jpg')).'" alt="Kamera 4"/></a><br/>';
echo '<a href="cam5"><img src="'.array_pop(glob('cam5/*.jpg')).'" alt="Kamera 5"/></a><br/>';
echo '<a href="cam6"><img src="'.array_pop(glob('cam6/*.jpg')).'" alt="Kamera 6"/></a><br/>';
echo '<a href="cam7"><img src="'.array_pop(glob('cam7/*.jpg')).'" alt="Kamera 7"/></a><br/>';
echo '<a href="cam8"><img src="'.array_pop(glob('cam8/*.jpg')).'" alt="Kamera 8"/></a><br/>';
echo '<a href="cam9"><img src="'.array_pop(glob('cam9/*.jpg')).'" alt="Kamera 9"/></a><br/>';
echo '<a href="cam10"><img src="'.array_pop(glob('cam10/*.jpg')).'" alt="Kamera 10"/></a>';
?>
</body>
</html>
Jos hashaa salasanan bcryptillä niin eikä sitä saa mitenkään enää siitä takasin niin miten toi bcrypt. Compare oikein voin toimia ollenkaan?
Jos hashaa salasanan bcryptillä niin eikä sitä saa mitenkään enää siitä takasin niin miten toi bcrypt. Compare oikein voin toimia ollenkaan?
Onko teillä preferenssiä sen suhteen että käyttääkö orm tekniikoita vai suoraan sql komentoja nodejs ohjelmassa? Omassa harjoitus projektissa olen käyttänyt typeormia ja typegraphql koska sillä saa tosiaan noi tyypit sitten.
On kyllä todellakin niin täysin alkeita relaatiotietokannoista, että jos on tarkoitus oppia, niin ei kannata valmista vastausta pyytää.Täysi aloittelija SQL:n parissa. Miten tuollainen kysely rakennetaan?
![]()
On kyllä todellakin niin täysin alkeita relaatiotietokannoista, että jos on tarkoitus oppia, niin ei kannata valmista vastausta pyytää.
Aina tarvitsee joinia kun yhdistellään tietoja useammasta taulusta, mutta tässä tapauksessa se join on aika yksinkertaista. Katso vaikka täältä mallia: SQL - Using JoinsEn tarvitse valmista vastausta, mutta koita ymmärtää ja suhteuttaa tämä totaalisen aloittelijan silmin. Olen kyllä asiaa koittanut pyörittää jo hyvän tovin itsekseni, mutta todennäköisesti ajattelen tätä nyt täysin väärältä kantilta kun se ei aukea. Tarvitaanko tuossa JOIN-syntaksia vai mitä tuohon kannattaa käyttää?
Pitäisi mennä ihan taulualiaksilla. Eli voit määritellä kyselyn niin, että kaupungit-taulua voi käsitellä kahtena eri instanssina (?). Kysely on niin simppeli tuon jälkeen, että en oikein tiedä miten vihjaista tämän enempää ilman, että ratkaisen tehtävän puolestasi.
Eli googlaa "sql table alias".
No ei tuo pelkillä aliaksilla onnistu vaan lisäksi pitää tehdä inner join, joka tosin tässä tapauksessa onnistuu implisiittisesti ilman että mitään join-syntaksia pitää kirjoittaa.Pitäisi mennä ihan taulualiaksilla. Eli voit määritellä kyselyn niin, että kaupungit-taulua voi käsitellä kahtena eri instanssina (?). Kysely on niin simppeli tuon jälkeen, että en oikein tiedä miten vihjaista tämän enempää ilman, että ratkaisen tehtävän puolestasi.
Eli googlaa "sql table alias".
Onko pakko käyttää sediä?Miksi mun juttu ei toimi?
merkkjono §12-34
haluan korvata väliviivan madolla ~ jos pykälän ja viivan välissä on tasan kaksi numeroa
§123-34 tätä ei saa muuttaa eikä §5-34
Yritin
echo §12-34 | sed -r "s/(?:\§[0-9]{2})\-/\~/"
jolloin tuo pykälä ja kaksi numeroa olisi non-capture group, mutta se vastaa §12-34 eikä §12~34
echo §12-24 | perl -pe 's/(§[0-9]{2})-([0-9]{2})\b/\1~\2/'
Onko pakko käyttää sediä?
Sama vika, suosittelen ehdottomasti. Todella näppärä kikkailla regexpejä kun saa kasan dataa copypastetettua ja voi livenä arpoa sopivaa regexpiä. Olisi manuaalisesti ainakin monimutkaisemmissa regexpeissä työlästä tehdä itse sopivaa omaa vastaavaa toiminnallisuutta kun tuolla saa hetkessä tstailtua sopivat säännöt.Noita regexpejä on helpon testata esim. regex101.com:ssa. Tuolla minä aina rakennan vähänkin monimutkaisemmat.
Täysi aloittelija SQL:n parissa. Miten tuollainen kysely rakennetaan?
![]()
SELECT
MISTA.NIMI AS KAUPUNKI_MISTA,
MINNE.NIMI AS KAUPUNKI_MINNE
FROM
LENNOT L,
KAUPUNGIT MISTA,
KAUPUNGIT MINNE
WHERE
L.MISTA_ID = MISTA.ID
AND L.MINNE_ID = MINNE.ID
---Tämän tyyppisissä muutaman rivin tehtävissä ei niin väliä, mutta jos tauluissa on paljon rivejä niin ratkaisumallilla on traaginen merkitys suoritusnopeuteen. Kannattaa siis opetella heti alusta lähtien välttämään alikyselyitä.
---
Itse suosin mahdollisimman selkeitä SQL-kyselyjä. Kyselyitä voi tarpeen mukaan optimoida.
Tosin epäilen vähän, että tehtävässä vaaditaan JOINia, ei alikyselyitä SELECTillä. Menee vielä kurssin vetäjällä herneet nenään, jos esittelee muuta kuin odotettuja SQL-kyselyitä.
Kyllä näin voisi olettaa, että JOINien harjoittelu kyseessä. Eli kyselyhän menisi siis JOINeilla näin:Tosin epäilen vähän, että tehtävässä vaaditaan JOINia, ei alikyselyitä SELECTillä. Menee vielä kurssin vetäjällä herneet nenään, jos esittelee muuta kuin odotettuja SQL-kyselyitä.
SELECT
k1.name AS mistä, k2.name AS minne
FROM
lennot l JOIN
kaupungit k1 ON k1.id = l.mista_id JOIN
kaupungit k2 ON k2.id = l.minne_id
Oikeastaan tähän voisin sen verran sanoa, että WHERE lause on SQL:ssä tarkoitettua filterointiin, jolla voidaan valita rivit, jotka otetaan mukaan tulosjoukkoon. Esimerkiksi joku kenttä on TRUE toinen FALSE, tai arvo on yli > 100 tai mitä ikinä.Tässä menee helposti sekaisin join (siis taulujen välinen liitos kyselyssä tavasta riippumatta) ja join- termillä toimiva syntaksi.
Tehtävässähän ei pyydetty tiettyä syntaksia vaan tulosta jolloin kaikkien versioiden (myös alikyselymalli) pitäisi olla "oikein". Käytännössä molemmat mallit pitäisi tietysti osata ja toivottavasti on esitetty myös materiaalissa/kurssilla.
Oikeastaan tähän voisin sen verran sanoa, että WHERE lause on SQL:ssä tarkoitettua filterointiin, jolla voidaan valita rivit, jotka otetaan mukaan tulosjoukkoon. Esimerkiksi joku kenttä on TRUE toinen FALSE, tai arvo on yli > 100 tai mitä ikinä.
Kun taas JOINit on ollut käytössä ainakin SQL-92:sta asti juuri taulujen liittämiseen. Jos kirjoitat kyselyn, jossa oikeasti filteroit useita asioita WHERE ehdolla ja kysely kohdistuu vaikka 12 tauluun, niin voin sanoa, että tulee aikamoinen sillisalaatti, jos käytät WHERE ehtoa myös taulujen liittämiseen. JOINeilla pystyt saman kirjoittamaan täysin erilleen siististi ja myös ottamaan huomioon sen, että jos haluat liittää tauluja, joissa toisessa on esimerkiksi NULL-arvoja id:n paikalla tai jotain muuta, mikä ei '='-merkillä toimi.
SQL Fiddle näyttää olevan hiukan 'jäässä', mutta kokeillaan DB-fiddleä, saat ehkä ideasta kiinni mitä ei voi tehdä WHERE lauseella, mutta LEFT JOINilla kylläkin:
DB Fiddle - SQL Database Playground
An online SQL database playground for testing, debugging and sharing SQL snippets.www.db-fiddle.com
Eli jos ajat sen kommentoidun selectin, jossa on WHERE lause, niin se filteroi joukkoa (samoin kuin JOIN), kun taas LEFT JOIN tässä tapauksessa ei filteroi ja silti liittää osuvat yhteen.
Melkoinen keksintö tuo pikaoppaan lataaminen kun pitää sähköpostiosoite antaa ja samalla liittyy postituslistalle ja vieläpä pdf-tiedostossakin salasana. Onneksi sekä temporarymail että Print to PDF toimii ettei tarvitse tulevaisuudessa ihmetellä jotain tiedoston salasanaa eikä saada roskapostia.Hyvästä en osaa sanoa, mutta arihovi.com -sivustolta voi tilata maksuttoman SQL-pikaopas E-kirjan.
Kirjoista löytyy varmasti hyviä vaihtoehtoja, mutta se mitä kannattaa erityisesti katsoa, että jos löytyisi kirja joka ei ota varsinaisesti kantaa mihinkään tiettyyn tietokanta tuotteeseen. Eli vähän kuin ohjelmoinnissa ensin pitää hallita ohjelmointi ja sitten voi helposti opetella tietyn kielen tarpeen mukaan.Olen käyttänyt tietokoneita "aina" ja ison osan ajasta koodannutkin, mutta en ole ikinä kirjoittanut riviäkään SQL:ää. En tajua yllä olevasta keskustelusta mitään. Mikäköhän olisi tehokas tapa näin "vanhemmalla iällä" opetella SQL:ää ja muita tietokantajuttuja, jos taustalla on tekniikan tohtorin tutkinto ja todennäköisesti ihan riittävä ymmärrys tietorakenteista ja algoritmeista? Onko esim. jotain hyvää kirjaa?
Stanfordin yliopistolla oli joskus ainakin mooc tietokannoista. Siinä oli tehtäviä tietysti myös mukana. Jos se jostain löytyisi. https://online.stanford.edu/courses/soe-ydatabases-databases tuo on nykyään osissa. Voi olla, että siinä on mukana jostain syystä XML:ää ja sen kyselykieliä, mutta ne voi skippailla.Olen käyttänyt tietokoneita "aina" ja ison osan ajasta koodannutkin, mutta en ole ikinä kirjoittanut riviäkään SQL:ää. En tajua yllä olevasta keskustelusta mitään. Mikäköhän olisi tehokas tapa näin "vanhemmalla iällä" opetella SQL:ää ja muita tietokantajuttuja, jos taustalla on tekniikan tohtorin tutkinto ja todennäköisesti ihan riittävä ymmärrys tietorakenteista ja algoritmeista? Onko esim. jotain hyvää kirjaa?
Käytämme välttämättömiä evästeitä, jotta tämä sivusto toimisi, ja valinnaisia evästeitä käyttökokemuksesi parantamiseksi.