Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Kaksi tietoa yhdellä SQL-kyselyllä

Sivun loppuun

mrkebab [02.10.2006 14:12:15]

#

Hei.

Eli tarvitsen kaksi eri tietoa MySQL taulusta.

Eli näin ne saa kahdella eri lauseella:

SELECT jotain  from TAULU1 where id=3;
SELECT jotain2 from TAULU2 where name="urpo";

Tiedot tarvitsisi pukata tietty kahteen eri muuttujaan, joten saako nuita samalla lauseella haettua ja laitettua omiin muuttujiinsa, vai täytyykö tehdä kaksi eri hakua ja eka haun jälkeen laittaa tulos muuttujaan ja sitten suorittaa toinen haku ja taas se toinen tieto muuttujaan2 ?

El-Ejecutor [02.10.2006 14:21:43]

#

SELECT Taulu1.kentta, Taulu2.kentta FROM Taulu1, Taulu2 WHERE Taulu1.kentta jne jne

mrkebab [02.10.2006 14:32:55]

#

Kiitos.

El-Ejecutor

El-Ejecutor [02.10.2006 14:44:43]

#

eipä mittää.
unohtu mainita että kyseessä on siis SQL liitos. niistä löytyy verkostakii hyviä ohjeita tulevaisuuden varalle. ihan hyödyllistä osata :)

Olga [02.10.2006 18:23:40]

#

Kannattaa tutustua myös uuteen liitossyntaksiin, avainsana on JOIN.

koo [03.10.2006 21:59:59]

#

Joineissa pitää vähän varoa karteesisia tuloja. Jos vaikka ekasta taulusta löytyykin joku tuhat riviä ja toisesta toinen mokoma, niin tulosjoukossa onkin yhtäkkiä miljoona riviä!

Jos nuo jotain-sarakkeet ovat samaa tyyppiä, kannattaa miettiä myös union-syntaksia:

SELECT jotain  from TAULU1 where id=3
UNION
SELECT jotain2 from TAULU2 where name="urpo";

Alkuperäisen kysymyksen oletuksilla tuloksena on kaksi riviä (siis kaksi fetch:iä) ja tuossa maalailemassani kauhuskenaariossakin enintään parituhatta riviä.

FooBat [03.10.2006 22:31:52]

#

Itse puolestaan en muista kertaakaan törmänneeni tapaukseen, jossa union olisi tarpeellinen. Yleensä sen voi korvata kahdella erillisellä haulla, jolloin eri tauluissa oleva data tulee haettua erillisiin hakujoukkoihin. Näitä on helponpi käsitellä ohjelmallisesti kuin että tulokset olisivat samassa joukossa ja ne joudutaan jotenkin erottelemaan toimenpiteitä varten (yleensähän data on eri tauluissa sen takia, että ne toimivat eri lailla).

Jos jossain joutuu tekemään kahden taulun täydellisen karteesisen tulon, on todella syytä miettiä kantarakenteita ja hakulauseita. On tietenkin mahdollisuus, että hakujoukko kasvaa suureksi, jos jossain taulussa on 1->n viittaus toiseen tauluun. Tälläisissä tapauksissa ei yleensä ole tarvetta hakea ensimmäistä taulua kokonaan vaan riittää hakea kerralla vain käyttöliittymässä näyttettävä osuus (joka on yleensä vain yksi tietue ja siihen liittyvät toisen taulun viittaukset).

koo [04.10.2006 00:12:35]

#

Union on kyllä harvinainen, mutta epätavallinen on tämä alkuperäinen kysymyskin, joka nimenomaan lähti liikkeelle kahdesta erillisestä hausta. Kaipa niitä kantarakenteita pitäisi sitten tässäkin tapauksessa miettiä: mitä yhteistä noilla haettavilla tiedoilla on? Karteesinen tulohan tuossa joinissa luuraa! Taulukohtaisten where-ehtojen perusteella ei ehkä täydellinen, mutta ei siellä kyllä ole yhtikäs mitään, mikä sitoisi taulut jollain tapaa toisiinsa ja rajoittaisi karteesisen tulon.

Pidän kyllä tässä epätavallista unionia tyhmää joinia parempana, jos nuo jotain-sarakkeet ovat samaa tyyppiä. Ja jos taas tiedetään niin paljon, että kyllähän nuo where-ehdot estävät useampiriviset tulojoukot, ihan varmana (vaikkeivat mitään taulujen välistä viittausta sisälläkään), niin ollaanko tässä ihan aikuisten oikeesti ratkaisemassa jotakin todellista ongelmaa, muutakin kuin jotain älypähkinää tai koulutehtävää.

Silloin kun unionia voi käyttää, se voi olla suorituskyvyltään erillisiä hakujoukkoja roimasti parempi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta