PDA

Bekijk Volledige Versie : [MySQL] Hulp bij JOIN-query



Maarten Wierda
21/10/03, 23:15
Beste nieuwsgroep,

Ik stuit op een probleem. In een MySQL-database sla ik in 2 tabellen de
informatie van een quiz op.

Tabel 'quiz_vraag':

+----------+-----------------------+-------------+
| vraag_id | vraag | antwoord_id |
+----------+-----------------------+-------------+
| 1 | Hoe heet deze jongen? | 1 |
+----------+-----------------------+-------------+

Tabel 'quiz_antwoord':

+-------------+----------+-----------+
| antwoord_id | vraag_id | antwoord |
+-------------+----------+-----------+
| 1 | 1 | Maarten |
| 2 | 1 | Sam |
| 3 | 1 | Tim |
+-------------+----------+-----------+

In dit geval is 'Maarten' het antwoord, zie de waarde in 'antwoord_id'
in de tabel 'quiz_vraag'.

Nu wil ik met een query alle gegevens hebben waar het vraag_id gelijk is
aan 1. Hieronder versta ik:

- de vraag
- het antwoord_id
- de antwoorden

Ik dacht dit als volgt te kunnen doen:

SELECT
v.vraag AS vraag,
a.antwoord_id AS antwoordID,
a.antwoord AS antwoordTekst,
v.antwoord_id AS correctAntwoord
FROM
quiz_vraag v,
quiz_antwoord a
INNER JOIN
quiz_antwoord
ON
v.vraag_id = a.vraag_id
WHERE
v.vraag_id = 1

Eigenlijk verwacht ik dus het volgende resultaat:

+-----------------------+------------+---------------+-----------------+
| vraag | antwoordID | antwoordTekst | correctAntwoord |
+-----------------------+------------+---------------+-----------------+
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
+-----------------------+------------+---------------+-----------------+

Maar in plaats van 3 resultaten krijg ik maar liefst 18 resultaten
terug, namelijk 6 maal bovenstaande. Ik post het resulaat toch maar even
ter verduidelijking:

+-----------------------+------------+---------------+-----------------+
| vraag | antwoordID | antwoordTekst | correctAntwoord |
+-----------------------+------------+---------------+-----------------+
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
| Hoe heet deze jongen? | 1 | Maarten | 1 |
| Hoe heet deze jongen? | 2 | Sam | 1 |
| Hoe heet deze jongen? | 3 | Tim | 1 |
+-----------------------+------------+---------------+-----------------+

Kan iemand me helpen met het opstellen van mijn query zodat ik 3
resultaten krijg in plaats van 18?

Alvast heel erg bedankt.

--
Cheers, Maarten Wierda

"Teenage angst has paid off well, now I'm bored and old"

Arjen Haayman
21/10/03, 23:30
Maarten Wierda wrote:

>
> SELECT
> v.vraag AS vraag,
> a.antwoord_id AS antwoordID,
> a.antwoord AS antwoordTekst,
> v.antwoord_id AS correctAntwoord
> FROM
> quiz_vraag v,
> quiz_antwoord a
houwe zo

> INNER JOIN
> quiz_antwoord
> ON
> v.vraag_id = a.vraag_id
> WHERE
> v.vraag_id = 1
zou ik zelf zo doen:
WHERE v.vraag_id = 1 AND v.vraag_id = a.vraag_id

groeten,
Arjen Haayman

-- cogito ergo bicyclo --

Maarten Wierda
21/10/03, 23:30
Maarten Wierda wrote:

> SELECT
> v.vraag AS vraag,
> a.antwoord_id AS antwoordID,
> a.antwoord AS antwoordTekst,
> v.antwoord_id AS correctAntwoord
> FROM
> quiz_vraag v,
> quiz_antwoord a
> INNER JOIN
> quiz_antwoord
> ON
> v.vraag_id = a.vraag_id
> WHERE
> v.vraag_id = 1

Natuurlijk kan ik gebruik maken van LIMIT, +-

SELECT
v.vraag AS vraag,
a.antwoord_id AS antwoordID,
a.antwoord AS antwoordTekst,
v.antwoord_id AS correctAntwoord
FROM
quiz_vraag v,
quiz_antwoord a
INNER JOIN
quiz_antwoord
ON
v.vraag_id = a.vraag_id
WHERE
v.vraag_id = 1
LIMIT 0,3

Maar dit is IMHO een *slordige* oplossing. Of heb ik dat mis?

--
Cheers, Maarten Wierda

"Teenage angst has paid off well, now I'm bored and old"

Ronald Paul
21/10/03, 23:30
Maarten Wierda <moart3nAT@chello.nl> schreef:

>Ik stuit op een probleem. In een MySQL-database sla ik in 2 tabellen de
>informatie van een quiz op.

[..]

>Ik dacht dit als volgt te kunnen doen:
>
>SELECT
> v.vraag AS vraag,
> a.antwoord_id AS antwoordID,
> a.antwoord AS antwoordTekst,
> v.antwoord_id AS correctAntwoord
>FROM
> quiz_vraag v,
> quiz_antwoord a
>INNER JOIN
> quiz_antwoord
>ON
> v.vraag_id = a.vraag_id
>WHERE
> v.vraag_id = 1
>
>Eigenlijk verwacht ik dus het volgende resultaat:

[..]

>Maar in plaats van 3 resultaten krijg ik maar liefst 18 resultaten
>terug, namelijk 6 maal bovenstaande.

In bovenstaande query JOIN je twee keer: vraag met antwoord en met
antwoord. Het simpel opsommen van twee tabellen gescheiden door een
komma is ook equivalent aan een INNER JOIN. Aangezien je op deze
eerste JOIN geen voorwaarde zet, krijg je een cartesisch product
tussen vraag en antwoord welke dan nog weer een keer 'gejoint' wordt
met quiz_antwoord.

Je hebt nu twee mogelijkheden: haal de tweede INNER JOIN weg en
verplaats de voorwaarde achter ON naar de WHERE (zoals Arjen
voorstelt), of: verwijder de eerste quiz_antwoord en geef de alias aan
de andere tabel.

--
Groet, Ronald

Ronald Paul
21/10/03, 23:30
Maarten Wierda <moart3nAT@chello.nl> schreef:

>Natuurlijk kan ik gebruik maken van LIMIT, +-

[..]

>INNER JOIN
> quiz_antwoord
>ON
> v.vraag_id = a.vraag_id
>WHERE
> v.vraag_id = 1
>LIMIT 0,3
>
>Maar dit is IMHO een *slordige* oplossing. Of heb ik dat mis?

Nee, hij is erg slordig inderdaad. Nu maak je een succesvolle query
afhankelijk van de inhoud van de database, en doorgaans is dat niet
iets wat je zou willen :-)

--
Groet, Ronald

Maarten Wierda
21/10/03, 23:30
Arjen Haayman wrote:

> zou ik zelf zo doen:
> WHERE v.vraag_id = 1 AND v.vraag_id = a.vraag_id

Onderstaande query levert inderdaad het gewenste resultaat op:

SELECT
v.vraag AS vraag,
a.antwoord_id AS antwoordID,
a.antwoord AS antwoordTekst,
v.antwoord_id AS correctAntwoord
FROM
quiz_vraag v,
quiz_antwoord a
WHERE
v.vraag_id = 1
AND
v.vraag_id = a.vraag_id

Kan dit ook in een JOIN-query worden geformuleerd? Of is een JOIN in dit
geval onnodig?

--
Cheers, Maarten Wierda

"Teenage angst has paid off well, now I'm bored and old"

Maarten Wierda
21/10/03, 23:45
Ronald Paul wrote:

> In bovenstaande query JOIN je twee keer: vraag met antwoord en met
> antwoord. Het simpel opsommen van twee tabellen gescheiden door een
> komma is ook equivalent aan een INNER JOIN. Aangezien je op deze
> eerste JOIN geen voorwaarde zet, krijg je een cartesisch product
> tussen vraag en antwoord welke dan nog weer een keer 'gejoint' wordt
> met quiz_antwoord.

Cartetisch product, daarvan herinner ik me nog dat van meerdere
verzamelingen, alle mogelijke tupels worden beschreven als het
Cartetisch product. Toch nog netjes opgelet tijdens Discrete Wiskunde ;-)

> Je hebt nu twee mogelijkheden: haal de tweede INNER JOIN weg en
> verplaats de voorwaarde achter ON naar de WHERE (zoals Arjen
> voorstelt), of: verwijder de eerste quiz_antwoord en geef de alias aan
> de andere tabel.

Ik heb de query nu als volgt geformuleerd en dat werkt prima.

SELECT
quiz_vraag.vraag AS vraag,
quiz_antwoord.antwoord_id AS antwoordID,
quiz_antwoord.antwoord AS antwoordTekst,
quiz_vraag.antwoord_id AS correctAntwoord
FROM
quiz_vraag
INNER JOIN
quiz_antwoord
ON
quiz_vraag.vraag_id = quiz_antwoord.vraag_id
WHERE
quiz_vraag.vraag_id = 1

Ronald en Arjen, beiden bedankt. En Ronald ietsje extra wegens de
heldere uitleg :-)

--
Cheers, Maarten Wierda

"Teenage angst has paid off well, now I'm bored and old"

John Bokma
23/10/03, 01:00
Maarten Wierda wrote:

> Arjen Haayman wrote:
>
>> zou ik zelf zo doen:
>> WHERE v.vraag_id = 1 AND v.vraag_id = a.vraag_id
>
>
> Onderstaande query levert inderdaad het gewenste resultaat op:
>
> SELECT
> v.vraag AS vraag,
> a.antwoord_id AS antwoordID,
> a.antwoord AS antwoordTekst,
> v.antwoord_id AS correctAntwoord
> FROM
> quiz_vraag v,
> quiz_antwoord a
> WHERE
> v.vraag_id = 1
> AND
> v.vraag_id = a.vraag_id
>
> Kan dit ook in een JOIN-query worden geformuleerd? Of is een JOIN in dit
> geval onnodig?

Wat denk je dat v.vraag_id = a.vraag_id is?

(hint: een join)

--
Kind regards, prachtige ideeen
John aan het einde van een dal
stromen dagelijks
http://johnbokma.com/ gedachtenwaterval

Maarten Wierda
23/10/03, 09:15
John Bokma wrote:

> > Kan dit ook in een JOIN-query worden geformuleerd? Of is een JOIN in dit
> > geval onnodig?
>
> Wat denk je dat v.vraag_id = a.vraag_id is?

Een INNER JOIN, en ik bedoelde natuurlijk een OUTER JOIN.

--
Cheers, Maarten Wierda

"Music is first, lyrics are secondary."