Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Mysql: etsiminen usemmasta kentästä

Sivun loppuun

pistemies [18.02.2005 22:51:15]

#

Millaisella lauseella tehdään kysely, etsitään valitulla hakusanalla usemmasta kentästä yhdellä kertaa?

ajv [18.02.2005 23:34:41]

#

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 :)

Wizard [19.02.2005 01:41:37]

#

Unohdit sulut:

SLECT foo
FROM bar
WHERE (otsikko LIKE '%hakusana%'
OR aihe LIKE '%hakusana%'
OR viesti LIKE '%hakusana%')

;)

pistemies [19.02.2005 10:30:43]

#

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ää?

ajv [19.02.2005 11:01:15]

#

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

pistemies [19.02.2005 11:14:57]

#

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.

ajv [19.02.2005 11:17:07]

#

Joo, ei se yhteishaku pelannutkaan ihan niin kuin tässä tekstikenttään kirjottaessani oletin. Poistin sen hämäämästä.

tsuriga [19.02.2005 12:35:39]

#

Mites kun http://www.parseerror.com/sql/select*isevil.html ?

Wizard [19.02.2005 13:44:34]

#

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. ;)

ajv [19.02.2005 13:53:17]

#

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.

abina [20.02.2005 11:09:53]

#

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.

ajv [20.02.2005 11:36:38]

#

abina:

Oisko

SELECT julkaistu, kirjoitettu FROM kirjoitukset ORDER BY julkaistu DESC, kirjoitettu DESC LIMIT 0,10

tjsp ?

Antti Laaksonen [20.02.2005 11:42:30]

#

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.

abina [20.02.2005 11:55:25]

#

jees! kiitos! noin simppeli juttu se olikin.

Wizard [20.02.2005 19:47:54]

#

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ä?

Antti Laaksonen [20.02.2005 20:17:16]

#

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.

Wizard [20.02.2005 20:37:49]

#

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.

Antti Laaksonen [20.02.2005 21:14:50]

#

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".


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta