Millaisella lauseella tehdään kysely, etsitään valitulla hakusanalla usemmasta kentästä yhdellä kertaa?
Ite olen käyttänyt ihan:
SLECT foo FROM bar WHERE otsikko LIKE '%hakusana%' OR aihe LIKE '%hakusana%' OR viesti LIKE '%hakusana%'
Jos tuohon on fiksumpi tapa, niin olisi tosiaan kiva kuulla se :)
Unohdit sulut:
SLECT foo
FROM bar
WHERE (otsikko LIKE '%hakusana%'
OR aihe LIKE '%hakusana%'
OR viesti LIKE '%hakusana%')
;)
Kiitos! Sain tämän toimimaan. Vielä, mikä on oikeaoppinen rivien haku. Minulla se on tällainen:
$rivit=@mysql_result(mysql_query("SELECT COUNT(Linkki OR Otsikko OR Kuvaus) FROM Hakemisto WHERE( Linkki LIKE '%$hakusana%' OR Otsikko LIKE '%$hakusana%' OR Kuvaus LIKE '%$hakusana%')"),0);
Tuo ilmeisesti toimii, mutta onko siinä jotain ylimääräistä?
Edit: Vielä löytyi yksi juttu. Tämä listaa tulokset väärinpän: Ö-A
$result = mysql_query("SELECT * FROM Hakemisto WHERE (Linkki LIKE '%$hakusana%' OR Otsikko LIKE '%$hakusana%' OR Kuvaus LIKE '%$hakusana%') ORDER BY Otsikko DESC LIMIT $start, $end") or die("<b><i>Tulostus ei onnistunut: </i></b> ".mysql_error());
Mikä mättää?
Oikeaoppinen rivihaku:
$rivit=@mysql_result(mysql_query(" SELECT COUNT(*) FROM Hakemisto WHERE( Linkki LIKE '%$hakusana%' OR Otsikko LIKE '%$hakusana%' OR Kuvaus LIKE '%$hakusana%')"),0);
Rivien määrän saat myös mysql_num_rows()-funktiolla jälkimmäisestä kyselystä.
Ja vielä tulokset oikeinpäin (ASC):
$result = mysql_query(" SELECT * FROM Hakemisto WHERE (Linkki LIKE '%$hakusana%' OR Otsikko LIKE '%$hakusana%' OR Kuvaus LIKE '%$hakusana%') ORDER BY Otsikko ASC LIMIT $start, $end") or die("<b><i>Tulostus ei onnistunut: </i></b> ".mysql_error());
Niin ja Wizard: ei nuo sulut pakolliset ole, mutta eipä niistä kyllä haittakaan ole. Päinvastoin selkeyttää :)
Muoks. Testaamaton / toimimaton koodi pois
Kiitos! Taas pelaa!
Sen verran vielä tuosta yhteist-hausta: Miten tuosta tulostetaan tuo rivien yhteismäärä?
Eipä sillä, että sitä nyt tässä välttämättä tarvitsen, nimittäin tuo rivimäärän pitää saada selville ennen tulostusta. Jos se ylittää tietyn märän, lisätään hakuun tuo LIMIT, joka listaa rivit sopivan kokoisissa sivuissa.
Joo, ei se yhteishaku pelannutkaan ihan niin kuin tässä tekstikenttään kirjottaessani oletin. Poistin sen hämäämästä.
Mites kun http://www.parseerror.com/sql/select*isevil.html ?
Suluista:
Tässä nimenomaisessa tapauksessa ne eivät ole pakollisia, mutta jos olisi hakuehtoja joissa on sekä AND että OR tarkentimia, niin sulut on käytännössä pakollisia.
Esim:
select *
from jostain
where (paikkakunta = 'ANKKALINNA'
or paikkakunta = 'HANHIVAARA')
and sukunimi = 'ANKKA'
Ilman sulkuja tulee hieman toisenlainen tulos kuin on tarkoitus. Ja koska olen kirjoittanut edellisen viestin klo 1:41 yöllä noin 3 promillen humalassa, niin viitataan kintaalla sille. ;)
tsuriga kirjoitti:
Mites kun http://www.parseerror.com/sql/select*isevil.html ?
No jos tuolla kannassa ei ole kuin nuo kentät 'Linkki', 'Otsikko' ja 'Kuvaus' (ja ehkä 'id') niin eipä tuo SELECT * paljon haittaa. Mutta oikeassa olet siinä suhteessa, että ei sieltä kannasta kannata mitään ylimääräistä hakea, kuin vain ne tarvittavat arvot.
Heitetetäänpäs tähän samaan juttuun yks kysymys: miten onnistuu kun haku järjestetään julkaisupäivämäärän mukaan. mutta siinä tapauksessa jos julkaisupäivämäärä on sama niin ne rivit missä on sama päivämäärä niin ne järjestetään kirjoituspäivämäärän mukaan.
14.2.2004 kirjoitettu: 13.2.2004 tuorein
11.2.2004 kirjoitettu: 10.2.2004 toiseks tuorein
10.2.2004 kirjoitettu: 9.2.2004 ekana koska kirjoituspvm on tuoreempi
10.2.2004 kirjoitettu: 8.2.2004 kirjoituspvm vanhempi kuin yllä oleva
9.2.2004 kirjoitettu: 8.2.2004 ja taas vähän vanhempi
.jne
mutta että se järjestäisi kirjoituspvm mukaan vain jos julkaisupvm on sama. ja vain ne rivit järjestäisi kirjoituspvm mukaan. tuli sekavasti mut ei voi oottaa sunnuntai aamuna parempaa.
abina:
Oisko
SELECT julkaistu, kirjoitettu FROM kirjoitukset ORDER BY julkaistu DESC, kirjoitettu DESC LIMIT 0,10
tjsp ?
Voit järjestellä useamman kentän mukaan tähän tapaan:
SELECT * FROM tiedot ORDER BY eka, toka, kolmas
Ensisijainen järjestely on kentän eka mukaan. Mutta jos eka on sama, järjestetään tokan mukaan. Jos sekä eka että toka ovat samat, järjestetään kolmannen mukaan. Jne.
Ehtojen yhdistyksessä taitaa mennä niin, että ANDit yhdistetään ensin ja sitten ORit. Kuitenkin sulkuja kannattaa käyttää, jos on vähänkin epävarma tai jos ehtoa muuttaa myöhemmin.
jees! kiitos! noin simppeli juttu se olikin.
Antti Laaksonen kirjoitti:
Ehtojen yhdistyksessä taitaa mennä niin, että ANDit yhdistetään ensin ja sitten ORit.
Mitähän mahdat tällä tarkoittaa? Voisitko antaa esimerkkejä?
Asiaa voi ajatella operaattoreiden "laskujärjestyksenä". Luvuillahan kertolaskut lasketaan yhteenlaskuja ennen. Samalla tavalla ANDit yhdistetään OReja ennen. Esimerkiksi ehto "A AND B OR C AND D" tarkoittaa samaa kuin "(A AND B) OR (C AND D)", koska ANDit ovat vahvempia. Vastaavasti ehto "A OR B AND C OR D" ei vastaa ehtoa "(A OR B) AND (C OR D)" vaan merkitys onkin "A OR (B AND C) OR D". Sen vuoksi omassa esimerkissäsi ilman sulkuja kirjoitettu ehto tarkoittaa, että paikkakunta on Ankkalinna tai yhtä aikaa paikkakunta on Hanhivaara ja sukunimi on Ankka. Sulkujen seurauksena sukunimen täytyy olla Ankka ja paikkakunnan jompikumpi mainituista.
Antti Laaksonen kirjoitti:
Asiaa voi ajatella operaattoreiden "laskujärjestyksenä". Luvuillahan kertolaskut lasketaan yhteenlaskuja ennen. Samalla tavalla ANDit yhdistetään OReja ennen. Esimerkiksi ehto "A AND B OR C AND D" tarkoittaa samaa kuin "(A AND B) OR (C AND D)", koska ANDit ovat vahvempia. Vastaavasti ehto "A OR B AND C OR D" ei vastaa ehtoa "(A OR B) AND (C OR D)" vaan merkitys onkin "A OR (B AND C) OR D". Sen vuoksi omassa esimerkissäsi ilman sulkuja kirjoitettu ehto tarkoittaa, että paikkakunta on Ankkalinna tai yhtä aikaa paikkakunta on Hanhivaara ja sukunimi on Ankka. Sulkujen seurauksena sukunimen täytyy olla Ankka ja paikkakunnan jompikumpi mainituista.
Esimerkissäni näin pitääkin olla eli sukunimi Ankka ja paikkakunnan jompi kumpi. Ilman sulkuja vastaus olisi ihan jotain muuta nimittäin kuten mainitsitkin.
Mitä tulee itse Boolean logiikkaan, niin suluthan ovat oleellinen osa sitä. Lähinnä minua jäi vaivaamaan tuo parin lauseen mittainen viestisi osa "Kuitenkin sulkuja kannattaa käyttää, jos on vähänkin epävarma" joka jäi siis lainauksestani pois jostain syystä(?).
SQL ei ole sinänsä vaikea syntaksi opetella, sen pystyy sisäistämään itse asiassa jopa tunneissa. Mutta SQL kuten monet muutkin ohjelmointikielet käyttävät Boolean logiikkaa ja siihen kuuluu siis osana sulut. Ihan kuten tavallisessakin matikassa.
Siis tarkoitin vain, että vaikka sulut voisi jostain jättää pois, ne on hyvä panna mukaan varmuuden vuoksi. Toisinaan sulkuja on pakko käyttää, välillä ne taas ovat vapaaehtoisia. Sulut tosiaan selkeyttävät.
Ilman sulkuja esim. "(A OR B) AND (C OR D)" pidentyisi muotoon "A AND C OR A AND D OR B AND C OR B AND D".
Aihe on jo aika vanha, joten et voi enää vastata siihen.