SQL-kysely

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
6945
Äänestä

Muut lukivat myös

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.

Äänestä
  • en viitsisi ryhtyä muuttamaan Tutkimukset-taulua ja haluaisin tehdä tuon jonkinlaisella SUBSTR-lauseella (tai vastaavalla), mutta kun ei onnistu :-(

    Äänestä

Ä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

Äänestä
  • >...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.

    Äänestä

>>> 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

Äänestä

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

Äänestä

Kommentoi aloitusta


crimsonglory kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu