Elikä on taulu, jossa on kaksi saraketta: Nimi ja tyyppi. Samalla nimellä voi olla niin monta tyyppiä kuin haluaa.
Esim:
Pentti 1
Jorma 2
Simo 3
Teppo 2
Pentti 2
Simo 1
Haluan saada tulostettua kaikki nimet joiden tyyppi on 1 JA 2, esimerkissä siis vain Pentti.
Millaisella kyselyllä onnistuisi?
Et kertonut taulun nimeä, alla se on vain "taulu".
SELECT a.nimi FROM taulu a, taulu b WHERE a.nimi = b.nimi AND a.tyyppi = 1 AND b.tyyppi = 2;
Jos käytät PHP:tä tai vastaavaa, kenties helpointa olisi noutaa kaikki nimet, jotka täyttävät jommankumman ehdon (tai yhden monista ehdoista), ja sitten tutkia for-silmukassa, mitkä nimet kelpaavat näytettäviksi.
SELECT nimi, tyyppi FROM nimet WHERE tyyppi IN (1, 2) ORDER BY nimi, tyyppi
Toki lopullisen nimilistan voi yrittää luoda myös MySQL:ssä, mutta ainakaan minä en keksi siihen mitään kovin hyvää tapaa. Jos vaadittavia tyyppejä on aina tarkalleen kaksi, seuraava kysely voisi toimia.
SELECT DISTINCT a.nimi FROM nimet a, nimet b WHERE a.nimi = b.nimi AND ((a.tyyppi = 1 AND b.tyyppi = 2) OR (a.tyyppi = 2 AND b.tyyppi = 1))
Muoks. Ja Chiman ehti näyttää, miten vastaavan kyselyn voi toteuttaa järkevämmin.
Chimanin tapa toimii juuri niinkuin pitääkin, kiitos siitä!
Miten tuosta sitten voisi muokata eteenpäin, jos halutaan hakea kolmen tai enemmän tyypin mukaan?
Kermakana kirjoitti:
Miten tuosta sitten voisi muokata eteenpäin, jos halutaan hakea kolmen tai enemmän tyypin mukaan?
Kerro vähän tarkemmin, vastaus riippuu siitä. Jos haluat lisätä vielä 3:n mukaan, tämä on helpoin tapa:
SELECT a.nimi FROM taulu a, taulu b, taulu c WHERE a.nimi = b.nimi AND a.nimi = c.nimi AND a.tyyppi = 1 AND b.tyyppi = 2 AND c.tyyppi = 3;
Tuon hakulausekkeen voi generoida esim. PHP:lla funktiossa, jolle annat halutut tyypit arrayssä.
Toisaalta, jos taulussa ei ole duplikaatteja eli esim. useita Pentti, 1 -pareja, voisit ryhmitellä tulokset nimen mukaan, katsoa että tyyppi sijoittuu etsimääsi ryhmään ja että kullekin nimelle löytyy yhtä monta osumaa kuin on haluttuja tyyppejäkin. Eli hakulauseena:
SELECT nimi FROM taulu WHERE tyyppi IN (1, 2, 3) GROUP BY nimi HAVING COUNT(tyyppi) = 3;
Toivottavasti toimii kuten ajattelin. Tuossa siis viimeisen rivin luku on sama kuin haluttujen tyyppien lukumäärä. Dynaamisesti tuo lause on erittäin helppo luoda esim. PHP:lla (implode(), count()).
Kiitos paljon! Tuo toinen tapa toimii 100% kuin halusin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.