Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL-lauseessa jotain häikkää

Hoover [03.01.2007 14:14:32]

#

Mikähän mahtaa olla vikana MySQL:n SELECT-lauseessa kun tulee aina monta kertaa samat rivit tietokannasta (tietokannassa kuitenkin on vain yksi kutakin) kyselyyn jos käytän OR operaattoria?

Esim.
SELECT taulu1.login, sukunimi, etunimi FROM taulu1, taulu2, taulu3 WHERE taulu1.login = taulu2.login and taulu2.login = taulu3.login and luokka = 1 or luokka = 2 or luokka = 3 or luokka = 0 ORDER BY sukunimi ASC

taulu1, taulu2, taulu3 sisältävät yhdistävän tietueen login. Taulu2:ssa on luokka tietue, joka voi olla arvoltaan 0-3. Tauluissa on sitten kaikenlaisia muita tietoja kans, mutta tämän ongelman kannalta ne eivät näytä oleellisilta.

Tietokannasta tulee tavaraa oikealla tavalla jos luokkia on vain yksi, esim. tälläisellä lauseella:
SELECT taulu1.login, sukunimi, etunimi FROM taulu1, taulu2, taulu3 WHERE taulu1.login = taulu2.login and taulu2.login = taulu3.login and luokka = 1 ORDER BY sukunimi ASC

Wizard [03.01.2007 16:40:14]

#

Kokeilepa muuttaa:

and luokka = 1 or luokka = 2 or luokka = 3 or luokka = 0

muotoon:

and (luokka = 1 or luokka = 2 or luokka = 3 or luokka = 0)

-W-

Harrikma [03.01.2007 17:27:16]

#

Tuossa SELECT lauseessa tulee ongelma, kun haet useasta taulusta ja yhdessä taulussa on useampia rivejä, jotka voidaan yhdistää tuohon taulu1 kenttään.

Eli jos taulussa 2 on luokka jolla on esimerkiksi toisella rivillä arvo 1 ja toisella arvo 2. Kun nämä tiedot yhdistetään tuon login kentän avulla tauluun 1 tuossa SELECT lauseessa tuottaa kysely tulokseksi kaksi riviä, vaikka et kyselisi tuota luokka kentän arvoa toisesta taulusta.

Ratkaisuna voisit esim ryhmitellä tiedot, niin että samanlaiset tiedot kootaan yhdeksi tulosriviksi GROUP BY lauseella:

SELECT taulu1.login, sukunimi, etunimi FROM taulu1, taulu2, taulu3 WHERE taulu1.login = taulu2.login and taulu2.login = taulu3.login and luokka = 1 or luokka = 2 or luokka = 3 or luokka = 0 GROUP BY taulu1.login, sukunimi, etunimi ORDER BY sukunimi ASC

eli tuolla GROUP BY lauseella pitäisi tuloksen näyttää ihan oikealta.
Huomaa! että GROUP BY lauseessa on lueteltava kaikki SELECT lauseella haettavat kentät, jos niissä ei käytetä funktioita (ESIM. MAX, MIN jne...)

Toinen toimiva ratkaisu olisi korvata SELECT komennolla SELECT DISTINCT ja pitää muu lause samanlaisena, mutta tämä ei toimi kaikissa MySQL versioissa.

Hoover [03.01.2007 20:50:27]

#

Kiitti, tuo Wizardin neuvo voisi toimia. Pitää testailla huomenissa. Eikä ole huono ajatus tuokaan Harrikmanin juitsu.

Hoover [03.01.2007 20:55:34]

#

Hmm... Entäpä onko mitään järkevämpää keinoa hakea koko taulusta jotain sanaa, kuin tehdä esim. seuraava lause:

SELECT * FROM taulu1 WHERE nimi LIKE $hakusana OR sukunimi LIKE $hakusana OR ... (tässä perässä voisi olla vaikka sata tietoa mistä haetaan $hakusanaa)

Tarkoitus olisi siis saada jonkinlainen haku tehtyä, joka osaa myös "villeillä korteilla" hakea, kun pistää hakusanan perään tai alkuun *-merkin.

ajv [03.01.2007 22:17:17]

#

Hoover kirjoitti:

Hmm... Entäpä onko mitään järkevämpää keinoa hakea koko taulusta jotain sanaa...

Full-Text Search?

Vastaus

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

Tietoa sivustosta