[interbase/sql] verschillende 'soorten' records ophalen*

Pagina: 1
Acties:

  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 12-04 13:50
Ik ben op het moment bezig met een project waarbij ik multiplechoise vragen moet opstellen die uit een database komen. Hiervoor heb ik een tabel waarin vragen staan, een tabel waarin anwoorden staan en een tabel die de vragen en antwoorden aan elkaar koppelt. Het ophalen van een vraag en het ophalen van een correct antowoord is geen probleem. Maar nu wil ik bij een vraag, drie foutieve antwoorden selecteren. Ik krijg dze sql echter niet in elkaar! Ik maak gebruik van interbase 7.

Ik heb het zo geprobeerd: maar dit geeft ook correcte antworoden terug (wat ook logisch is als ik de sql naloop, maar ik weet niet hoe het wel moet):
code:
1
SELECT DISTINCT(antwoord) FROM antwoord a, vraagAntwoord vA WHERE vA.antwoord_id = a.competentie_id And vA.vraag_id <> [vraag_id] ROWS 3


Dit zijn de 3 tabellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+ Vraag
-----------
vraag_id
vraag

+ Antwoord
-------------
antwoord_id
antwoord

+ VraagAntwoord
---------------------
vraag_id
antwoord_id


Alvast hartelijke bedankt!

edit: vergeten de titel te veranderen, excuses hiervoor

[ Voor 10% gewijzigd door maurad3r op 09-01-2006 13:13 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17-04 23:42
Je zou het kunnen oplossen mbhv een UNION.

Je doet één select waarbij je de juiste oplossing ophaalt, en dan doe je een andere select waarbij je 3 foutieve antwoorden ophaalt. Die voeg je dan samen mbhv een UNION.
code:
1
2
3
select ...
union
select ...

https://fgheysels.github.io/


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 12-04 13:50
whoami schreef op maandag 09 januari 2006 @ 13:00:
Je zou het kunnen oplossen mbhv een UNION.

Je doet één select waarbij je de juiste oplossing ophaalt, en dan doe je een andere select waarbij je 3 foutieve antwoorden ophaalt. Die voeg je dan samen mbhv een UNION.
code:
1
2
3
select ...
union
select ...
Nou het samenvoegen is niet echt het probleem: dat lukt wel.
Het probleem is dat ik niet weet hoe ik 3 foutieve antwoorden bij een vraag kan krijgen!! Zodra ik dat probeer krijg ik er ook correcte antwoorden bij zitten. Ik zoek dus naar een query die alleen 3 foutieve antwoorden ophaalt!

Toch bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17-04 23:42
jij weet je datamodel; jij weet hoe je de juiste antwoorden kunt ophalen, dmv die join.
Als je nu eens logisch nadenkt, weet je ook welke antwoorden er fout zijn voor die vraag, nl. die antwoorden waarvoor je geen record hebt in je 'vraagantwoord' tabel voor die vraag.
Die kan je er dus uithalen mbhv een subquery.
code:
1
2
3
select ...
from ...
where id not in ( select .. )


Dan moet je nog enkel je result-set zien te beperken tot 3. Ik ken geen Interbase, maar wellicht heeft die wel een functie waarbij je je resultset kunt limiteren (cfr TOP in SQL Server, LIMIT in MySQL).

https://fgheysels.github.io/


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
De query die je geeft komt niet overeen met de tabellen die je geeft.

En hoe bepaal je welke foute antwoorden bij een vraag horen? zijn dat alle overige antwoorden in de tabel Antwoord, dit zou ik wat vreemd vinden maar goed, als er meerdere antwoorden bij 1 vraag horen, hoe wordt dan bepaald welk antwoord het goede is?

met de eerste situatie wordt de query ongeveer:
code:
1
2
3
4
SELECT antwoord
FROM Antwoord AS A INNER JOIN VraagAntwoord VA ON A.antwoord_id = VA.antwoord_id
WHERE vraag_id <> [vraag_id]
ROWS 3

[ Voor 4% gewijzigd door Serpie op 09-01-2006 13:09 ]


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 12-04 13:50
Serpie schreef op maandag 09 januari 2006 @ 13:06:
De query die je geeft komt niet overeen met de tabellen die je geeft.

En hoe bepaal je welke foute antwoorden bij een vraag horen? zijn dat alle overige antwoorden in de tabel Antwoord, dit zou ik wat vreemd vinden maar goed, als er meerdere antwoorden bij 1 vraag horen, hoe wordt dan bepaald welk antwoord het goede is?

met de eerste situatie wordt de query ongeveer:
code:
1
2
3
4
SELECT antwoord
FROM Antwoord AS A INNER JOIN VraagAntwoord VA ON A.antwoord_id = VA.antwoord_id
WHERE vraag_id <> [vraag_id]
ROWS 3
Sorry van de query: deze heb ik aangepast nu.

Het is idd te bedoeling dat er per vraag alleen wordt gekeken welke antwoorden goed zijn: de fouten antwoorden van een vraag zijn dan automatisch de antwoorden die niet voorkomen tussen de goede antwoorden!

Je SQL doet het ook niet goed:
stel dat een vraag 3 goede antwoorden. Ook andere vragen maken gebruiken van deze antwoorden (een belangrijk gegeven volgens mij waarom het niet werkt). Als ik vervolgens jou sql loslaat op de database dan krijg ik als foutief antwoord een antwoord terug wat opgegeven staat als correct antwoord!! Ik denk dat het met een exclude op te lossen is: maar deze wordt neit ondersteunt door mijn interbase versie |:(. Erg bedankt iig!!

Wie o wie kan me helpen!!

edit: de topic titel suggereert nu iets heel anders, ik weet ook niet wat het wel moet zijn eerlijk gezegd: suggesties?

[ Voor 5% gewijzigd door maurad3r op 09-01-2006 13:24 ]


  • maurad3r
  • Registratie: Oktober 2004
  • Laatst online: 12-04 13:50
whoami schreef op maandag 09 januari 2006 @ 13:06:
jij weet je datamodel; jij weet hoe je de juiste antwoorden kunt ophalen, dmv die join.
Als je nu eens logisch nadenkt, weet je ook welke antwoorden er fout zijn voor die vraag, nl. die antwoorden waarvoor je geen record hebt in je 'vraagantwoord' tabel voor die vraag.
Die kan je er dus uithalen mbhv een subquery.
code:
1
2
3
select ...
from ...
where id not in ( select .. )


Dan moet je nog enkel je result-set zien te beperken tot 3. Ik ken geen Interbase, maar wellicht heeft die wel een functie waarbij je je resultset kunt limiteren (cfr TOP in SQL Server, LIMIT in MySQL).
sorry, ik zag je reactie over het hoofd..
dit ga ik evern proberen!

alvast bedankt

edit:
Het is helemaal gelukt, erg bedankt!! Op een subqeury was ik idd neit gekomen: harstikke bedankt whoami! Nog even de query

code:
1
2
3
4
5
6
7
SELECT DISTINCT(antwoord) 
FROM vraagAntwoord vA, antwoord a 
WHERE vA.antwoord_id = a.antwoord_id 
AND vA.antwoord_id NOT IN (SELECT antwoord_id 
                                FROM antwoord a, vraagAntwoord vA 
                                WHERE vA.antwoord_id =   a.antwoord_id AND vA.vraag_id = 8) 
ROWS 3


let in het vervolg ff op de formattering van je query, zodat die leesbaar op het scherm komt, zonder dat men al te veel hoeft te scrollen.
Ik heb het nu ff voor je aangepast

[ Voor 40% gewijzigd door whoami op 09-01-2006 14:23 . Reden: Gelukt!! ]

Pagina: 1