Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL-hakuongelma

Kermakana [14.03.2008 23:35:08]

#

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?

Chiman [14.03.2008 23:59:22]

#

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;

Antti Laaksonen [15.03.2008 00:01:10]

#

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.

Kermakana [15.03.2008 01:55:00]

#

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?

Chiman [15.03.2008 11:15:04]

#

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

Kermakana [15.03.2008 18:17:53]

#

Kiitos paljon! Tuo toinen tapa toimii 100% kuin halusin.

Vastaus

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

Tietoa sivustosta