[sql] recordset haalt records n keer dubbel op

Pagina: 1
Acties:

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
Ik ben bezig met een web-site waarbij de bezoeker kan stemmen waar hij het liefst naar toe wil. Nu heb ik dit gemaakt dmv. van open vragen (het idee is dat de medewerker "stemt" waar hij het bedrijfsfeest wilt vieren) ik heb hiervoor verschillende tabellen namelijk:

tbl_polls
poll is omschrijving van de poll (poll_id)
tbl_question
bevat alle vragen (question_id)
tbl_answers
bevat alle mogelijke MC antwoorden (answer_id)
tbl_question_answers
koppelt een vraag aan x (1-N) antwoorden

Nu wil ik graag op een gemakkelijke meer zowel de vraag zelf ophalen en de mogelijke antwoorden. Nu heb ik onderstaand query bedacht, alleen ik krijg nu te vaak de mogelijke antwoorden terug (stuk of 15 keer; dat is iets minder dan het aantal records in tbl_answers)). Nu is mijn vraag wat doe ik fout?

query
code:
1
2
3
4
5
SELECT poll_a.answer,poll_a.answer_id,poll_question_.answer_id,poll_question_.question_id,poll_questions.question,poll_questions.question_id
    FROM poll_answers poll_a, poll_question_answers poll_question_, poll_questions poll_questions
    WHERE ( poll_question_.answer_id=poll_a.answer_id)
     AND ( poll_question_.question_id={$question_id})
     AND ( poll_question_.question_id=poll_questions.question_id)


Als ik deze query uitvoer krijg ik nu 5x drie antwoorden terug in de recordset, de drie antwoorden zijn de gekoppelde antwoorden aan de vraag.

Dit:

Waar wilt U het liefst feesten?
Antwoord 1 Efteling
Antwoord 2 Six Flags Holland
Antwoord 3 Muiderslot
Antwoord 4 Efteling
Antwoord 5 Six Flags Holland
Antwoord 6 Muiderslot
Antwoord 7 Efteling
Antwoord 8 Six Flags Holland
Antwoord 9 Muiderslot
Antwoord 10 Efteling
Antwoord 11 Six Flags Holland
Antwoord 12 Muiderslot
Antwoord 13 Efteling
Antwoord 14 Six Flags Holland
Antwoord 15 Muiderslot

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                 // {Todo alienfruit 1 management Change query to obtain question text in the same query as the answers }
                 // {Todo alienfruit 1 database Fix the query that showing duplicates of the possible MC answers }
     $dbrecord = NULL;  
     $i = 1;
     print "<table width=\"500\" cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n";
     print "<tr>\n";
     print "<td colspan=\"3\"><b>{$question}</b></td>\n";
     print "</tr>\n";
     while ( $dbrecord = mysql_fetch_object( $query_id ) ) {
     print "<tr>\n";
         print "<td width=\"15\">&nbsp;</td>\n";
         print "<td width=\"50\">Antwoord {$i}</td>\n"; 
         print "<td>{$dbrecord->answer}</td>\n";
         print "</tr>\n";
         $i++;
     }
     print "</table>\n";



Ik maak gebruik van MySQL en PHP.

[ Voor 67% gewijzigd door alienfruit op 05-08-2003 15:35 . Reden: phpcode geplaatst ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Hoe ziet jouw query eruit, en hoe ziet het resultaat van die query eruit?

Kan je het probleem niet oplossen met een distinct?

https://fgheysels.github.io/


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
whoami, sorry ik heb de query geplaatst was iets te vroeg met versturen.
Ik heb geen idee wat distinct doet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
't Is dan misschien eens een idee om eens na te gaan wat DISTINCT wel doet...

DISTINCT zorgt ervoor dat er enkel unieke rows in je recordset voorkomeN.

https://fgheysels.github.io/


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
whoami, ik ben reeds bezig het op te zoeken in me SQL boek ("Instant SQL Programming by Joe Celko)

[ Voor 58% gewijzigd door alienfruit op 05-08-2003 15:24 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Een distinct zal hier dus uw probleem niet oplossen.

Misschien is het beter als je een query schrijft die gebruik maakt van een count en group by, zodat je het volgende resultaat kunt krijgen:
efteling 5
muiderslot 5
six flags holland 5

https://fgheysels.github.io/


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
Maar ik kan dus niet alle gegevens dmv. een query ophalen? Of bedoel je met count en group by dat hij het eigenlijk gaat tellen hoe vaak een antwoord voorkomt. Maar dat ik dat gewoon negeer?

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
je moet die group by doen op datgene wat dubbel is. met count kun je dan vervolgens nagaan hoevaak ie dubbel voorkomt (en hoevaak die dus als antwoord is gekozen op de vraag). het maakt niet zoveel uit op welke kolom je die count doet. ik neem daar meestal de id kolom voor. Let wel op dat je 'm nog even een alias geeft, zodat je 'm wat makkelijker in je script kunt aanspreken

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
marty, ik wil niet weten hoe vaak de vraag is gekozen maar ik wil hem maar één keer hebben om hem zodoende een keer weer te geven ipv 16 keer :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Je kan dan een select distinct doen op enkel de column die je wil zien.

https://fgheysels.github.io/


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Topicstarter
Werkt tot nu zoals ik wil! Fantastisch! :)
Stuk makkelijker dan ik had gedacht 8)7 |:(
Maarja, ben ik ook geen ster in SQL :(

code:
1
2
3
4
5
6
7
SELECT DISTINCT poll_a.answer,poll_a.answer_id,poll_question_.answer_id,poll_question_.question_id,poll_questions.question,poll_questions.question_id 
FROM poll_answers poll_a, poll_question_answers poll_question_, poll_questions poll_questions 
WHERE ( poll_question_.answer_id=poll_a.answer_id) 
AND ( poll_question_.question_id=1) 
AND ( poll_questions.question_id=poll_questions.question_id) 
AND ( poll_question_.quiz_id = 1 ) 
GROUP BY poll_a.answer

[ Voor 9% gewijzigd door alienfruit op 05-08-2003 16:42 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Ranzige oplossing als ik eerlijk mag zijn.

In MySQL werkt jouw query, maar als je hem eens zou testen in een echt RDBMS (Sql Server, Oracle, ...) zal die toch niet zo goed werken.
MySQL laat gewoon dingen toe die niet zouden mogen:
Een group by clausule mag je enkel gebruiken als je aggregated funties gebruikt in je select list. Dat doe jij niet. Verder moet iedere column in je select-list die geen resultaat is van een aggregated functie, in de group by opgenomen worden.

https://fgheysels.github.io/

Pagina: 1