Haluan tehdä Access-tietokantaan SQL-kyselyn, joka hakee tietylle henkilölle Henkilot-taulusta mjat "HenkiloID ja Etusukunimi" sekä yhdistää Tutkimukset-taulusta kyseisen henkilön tekemät tutkimukset, jotka listataan. Alla oleva haku hakee ne tutkimukset, joissa on ainoastaan yksi kirjoittaja eli juuri se haettu henkilö. Tarvitsisin kuitenkin sellaisen haun, joka hakee myös ne tutkimukset, joissa on useampi kirjoittaja eli haettu henkilö on osa mjasta Tutkimukset.Kirjoittaja - tulinkohan nyt ymmärretyksi? Miten hakuani tulisi muuttaa? Osaisiko kukaan neuvoa?
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Vuosi, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja, Tutkimukset.PDFlinkki
FROM
WHERE HenkiloID=ID AND Henkilot.Etusukunimi = Tutkimukset.Kirjoittaja
ORDER BY Numero DESC
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Vuosi, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja, Tutkimukset.PDFlinkki
FROM
WHERE HenkiloID=ID AND Henkilot.Etusukunimi = Tutkimukset.Kirjoittaja
ORDER BY Numero DESC
Vastaukset 6
Vanhimmat
Oletetaan, että henkilo-taulussa on kentät nimi ja id, tutkimus-taulussa kentät nimi ja id, ja kirjoittajat-taulussa henkid ja tutid.
Näin haetaan teokset, jonka kirjoittamiseen on osallistunut henkilö numero 3:
select tutkimus.nimi,henkilo.nimi
from henkilo,tutkimus,kirjoittajat
where henkilo.id=3
and henkilo.id=kirjoittajat.henkid
and kirjoittajat.tutid=tutkimus.id
order by 1
Tarvit siis sellaisen taulun, jossa on henkilön id ja tutkimuksen id. Näin voi yhdellä henkilöllä olla monta tutkimusta ja yhdellä tutkimuksella monta kirjoittajaa.
en viitsisi ryhtyä muuttamaan Tutkimukset-taulua ja haluaisin tehdä tuon jonkinlaisella SUBSTR-lauseella (tai vastaavalla), mutta kun ei onnistu :-(
Äh koodissani oli virhe eli tämä toimii nyt kun on yksi kirjoittaja, mutta ei toimi useammalle kirjoittajalle...
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Vuosi, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja, Tutkimukset.PDFlinkki
FROM Tutkimukset INNER JOIN Henkilot ON Tutkimukset.Kirjoittaja = Henkilot.Etusukunimi
WHERE HenkiloID=ID
ORDER BY Numero DESC
>...ei toimi useammalle kirjoittajalle...
Miten tämä "useampi kirjoittaja" on taulussa ilmaistu?
Jos Tutkimukset.Kirjoittaja-kentässä on vain monta nimeä tekstipötkönä niin käytä hakuehtona operaattoria "like" liian tiukan "="-operaattorin asemesta.
>>> haettu henkilö on osa mjasta Tutkimukset.Kirjoittaja
Tässä on mielestäni suunnittelu virhe, jos Tutkimukset.Kirjoittaja on esim muotoa
"NimiSukunimi1;NimiSukunimi2;NimiSukunimi3"
>>> en viitsisi ryhtyä muuttamaan Tutkimukset-taulua ja haluaisin tehdä tuon jonkinlaisella SUBSTR-lauseella
Tutki esimerkki: http://forge.mysql.com/tools/tool.php?id=4
Kokeilin MySQL:llä muokkaten tuota yhdessä viestissä kertomaasi kyselyäsi, niin. Jos haluat listata kaikki tutkimukset joissa on ollut mukana jokin matti niminen henkilö niin se onnistuu seuraavasti:
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja
FROM Tutkimukset
INNER JOIN Henkilot ON Tutkimukset.Kirjoittaja LIKE CONCAT('%', Henkilot.Etusukunimi, '%') AND Henkilot.etusukunimi LIKE '%Matti%'
ORDER BY Numero DESC
Tai yksinkertaisemmin jos CONCAT lause ei toimi accesissa:
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja
FROM Tutkimukset INNER JOIN Henkilot ON Tutkimukset.Kirjoittaja LIKE '%Matti Meikäläinen%' AND Henkilot.Etusukunimi = 'Matti Meikäläinen'
ORDER BY Numero DESC
Myslissä ei tarvitse tuota inner join juttua vaan onnistuu myös seuraavasti:
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja
FROM Tutkimukset, Henkilot
WHERE Tutkimukset.Kirjoittaja LIKE CONCAT('%', Henkilot.Etusukunimi, '%') AND Henkilot.Etusukunimi = 'Matti Meikäläinen'
ORDER BY Numero DESC
Tai yksinkertaisemmin, jos concat lause ei toimi Accesissa:
SELECT Henkilot.HenkiloID, Henkilot.Etusukunimi, Tutkimukset.Numero, Tutkimukset.Otsikko, Tutkimukset.Kirjoittaja
FROM Tutkimukset, Henkilot
WHERE Tutkimukset.Kirjoittaja LIKE '%Matti Meikäläinen%' AND Henkilot.Etusukunimi = 'Matti Meikäläinen'
ORDER BY Numero DESC