[MySQL] Query met verschillende ENNEN/OFFEN

Pagina: 1
Acties:

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Hallo.

Een probleem dat volgens mij half logica, half beperkte kennis van MySQL betreft. Het gaat om de volgende (versimpelde) table, waarin resultaten van een survey worden opgeslagen.

code:
1
2
3
4
5
6
table results {
  resultID    PRI KEY
  userID (int 11)
  questionID (int 11)
  answerID (int 11)
}


In deze tabel staan - voor het voorbeeld - 4 records, te weten:

code:
1
2
3
4
5
resultID   userID    questionID      answerID
1              1             1           1
2              1             2           3
3              2             1           2
4              2             2           4


Op deze manier wordt bij iedere vraag die wordt gesteld, het multiple-choice antwoord opgeslagen bij de betreffende gebruiker.

Nu wil ik graag een rapportage maken, waarin ik alle gebruikers terughaal, waarvoor geldt:

A. (questionID=1 AND answerID=1)
B. (questionID=1 AND answerID=2)
C. (questionID=2 AND answerID=3)

Nu gaat het om het probleem met EN-en en OF-en. Bekijk de volgende queries:

Voorbeeld 1:
code:
1
2
3
4
5
6
SELECT * 
FROM results
WHERE (
  (questionID =1 AND answerID =1) OR (questionID =1 AND answerID =2)
)
  OR (questionID =2 AND answerID =3)


Voorbeeld 2:
code:
1
2
3
4
5
6
SELECT * 
FROM results
WHERE (
  (questionID =1 AND answerID =1) OR (questionID =1 AND answerID =2)
)
  AND (questionID =2 AND answerID =3)


In het eerste voorbeeld krijg ik beide gebruikers geselecteerd. Dat is onwenselijk, want gebruiker 2 voldoet niet aan de voorwaarde C. In het tweede voorbeeld wordt geen enkele gebruiker geselecteerd. Waarschijnlijk omdat er een andere manier is om die query goed weer te geven.

Wie kan mij verder helpen?

Alvast enorm bedankt!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 23-05 13:53

Kees

Serveradmin / BOFH / DoC
is het:
select distinct userid where A or B or C (moet hij voldoen aan A, B of C) of
select distinct userid where [norml](A or B)[/] and C (moet hij op vraag 1 antwoord 1 of 2 geven, en op vraag 2 antwoord 3)

Met de eerste querie krijg je user 1 en 2 terug, immers user 1 voldoet aan A en C, en user 2 voldoet aan A.
De tweede querie krijg je user 1 terug, de enige die voldoet aan A of B en C.

De volledige querie in dat geval:
(distinct wordt gebruikt zodat je geen dubbele resultaten terugkrijgt, wat bij je database model nog wel voor kan komen tenzij je een unique zet op userID, questionID, answerID)
code:
1
2
3
4
SELECT DISTINCT userID
FROM results
WHERE (questionID = 1 AND (answerID = 1 OR answerID = 2))
AND (questionID = 2 AND answerID = 3)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Ja, die laatste query, zo had ik er ook eentje. Maar dat werkt nog steeds niet. Die query geeft geen resultaten terug.

Specifiek om dit te testen heb ik ook een test-tabel gemaakt, die exact met het voorbeeld overeenkomst (inclusief inhoud). Hij vindt nu niets, waarschijnlijk omdat de opgegeven criteria niet in één row voorkomen of zo.

Raar dat zo iets ogenschijnlijk simpels nog zo lastig kan zijn.... |:(

[ Voor 56% gewijzigd door gvanh op 23-08-2004 18:19 ]


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Aanvulling...

Om iets verder tot de 'core' van het probleem te komen ... de volgende query werkt al niet:

code:
1
2
3
4
SELECT userID
FROM results
WHERE answerID = 2
AND answerID = 3;


En da's natuurlijk redelijk logisch, want er zijn ook geen rows die voldoen aan het criterium dat answerID EN 2 EN 3 is. Da's onzin, want per row staat er maar één answerID column.

Nu lijkt het me echter sterk dat er niet toch een oplossing voor iets dergelijks is... dit moet toch vaker voorkomen?

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 23-05 13:53

Kees

Serveradmin / BOFH / DoC
eh, ja natuurlijk, dat werkt niet...

Dan maar vies :P
code:
1
2
3
4
SELECT userID
FROM results
WHERE (questionID = 1 AND (answerID = 1 OR answerID = 2))
OR (questionID = 2 AND answerID = 3) and count(*) = 2 group by userID

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Hmm...

MySQL retourneerde:

#1111 - Invalid use of group function

Dat count zou dan op een andere manier gebruikt moeten worden ... enig idee?

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22-05 11:36
gvanh schreef op 23 augustus 2004 @ 18:44:
Aanvulling...

Om iets verder tot de 'core' van het probleem te komen ... de volgende query werkt al niet:

code:
1
2
3
4
SELECT userID
FROM results
WHERE answerID = 2
AND answerID = 3;


En da's natuurlijk redelijk logisch, want er zijn ook geen rows die voldoen aan het criterium dat answerID EN 2 EN 3 is. Da's onzin, want per row staat er maar één answerID column.

Nu lijkt het me echter sterk dat er niet toch een oplossing voor iets dergelijks is... dit moet toch vaker voorkomen?
Ik zal voor deze een vuile oplossign geven, maar daarmee moet het je lukken om je oorspronkelijke vraag op te lossen (op een vuile manier):

SQL:
1
2
3
4
5
SELECT userID
  FROM results
  WHERE answerID = 2 OR answerID = 3 
  GROUP BY userID 
  HAVING COUNT(*)=2;


Oftewel tel alle records waarbij antwoord=2 or antwoord=3, groepeer ze per gebruiker en vermeld de gebruikker indien er twee records (antwoorden) zijn.

[ Voor 12% gewijzigd door jvdmeer op 23-08-2004 19:20 ]


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Jottem!

Ik heb het werkende gekregen!

Dank voor alle hulp!

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

Deze "vuile" manier heb ik een tijdje geleden ook toegepast (ik vond eigenlijk dat ik dat wel goed bedacht had :P), maar is er een nettere manier voor?
Pagina: 1