Hilfe bei SQL Abfrage

Rootbob91

Aktiver Benutzer
Beiträge
27
Guten Abend/Nacht,

mit meinem ersten Beitrag würde ich euch gerne um Hilfe bei folgendem Problem bitten:

erstmal eine kurzfassende Aussage was die Abfrage tun soll:

Pseudogeschwafel: Hol mir alle Fragen aus der Tabelle tFragen, die nicht bereits in der Liste mit der ID xy sind.

Meine Datenbank/Tabellenstruktur sieht so aus (habs auf das Nötigste abgesppeckt):

Die Tabelle tFragen hat folgende Struktur (Beispiel!:
cID cText cAntwort
0 Wie viel ist 1+1? 2
1 Wie viel ist 3+2? 5

Jetzt habe ich eine Tabelle tAnlagen, wo die Tatsächlichen Anlagen einer Liste dieser Fragen gespeichert wird:
cID cName
0 Testliste
1 Blabla Liste 2


Letztendlich wäre da noch die Tabelle tInhalte, die die Inhalte dieser Listen enthält & einer Liste dann zuordnet:
cID tFragen_ID tListen_ID
1 0 0
2 1 0

Aus de Datenmodell kann man erkennen, dass die Liste namens "Testliste" 2 Fragen beinhaltet.

Wie handhabe ich es jetzt, dass ich nur die Fragen aus tFragen zurückbekomme, die sich nicht in der Liste Testliste befinden?

Ich hatte überlegt die einzelnen IDs der Fragen die sich bereits dort drin befinden mit in die WHERE Klausel a la "WHRE ID <> xy AND ID <> zq" aufzunehmen, aber geht das nicht besser.
Das ganze passiert via VB in einem PHP Script, dann müsste ich dem Script nicht mitliefern, welche Fragen sich dort bereits drin befinden, sondern könnte die schon bei der Abfrage filtern.

Ich hoffe ihr konntet mir folgen!
Vielen Dank schonmal!!
 
Werbung:
Guten Abend/Nacht,

Ich hoffe ihr konntet mir folgen!
Vielen Dank schonmal!!

Versuch mal in Zukunft mit Code-Tags zu arbeiten, ist besser lesbar.

Zu Deinem Problem:

gehe systematisch vor. Ermittle z.B. erst einmal alle Fragen, die in dieser Liste sind. Mit Deinen Daten:

Code:
test=*# select * from tfragen ;
 cid |  ctext  | cantwort
-----+------------------+----------
  0 | wie viel ist 1+1 | 2
  1 | wie viel ist 3+2 | 5
(2 rows)

test=*# select * from tanlagen ;
 cid |  cname
-----+----------------
  0 | testliste
  1 | blabla liste 2
(2 rows)

test=*# select * from tinhalte ;
 cid | tfragen_id | tlisten_id
-----+------------+------------
  1 |  0 |  0
  2 |  1 |  0
(2 rows)

kannst das so ermitteln:

Code:
test=*# select * from tfragen where cid in (select tfragen_id from tinhalte where tlisten_id = (select cid from tanlagen where cname = 'testliste'));  cid |  ctext  | cantwort
-----+------------------+----------
  0 | wie viel ist 1+1 | 2
  1 | wie viel ist 3+2 | 5
(2 rows)

Diese Menge möchtest Du von der Gesamtmenge, die in tfragen ist, abziehen, dazu dient der EXCEPT-Operator:

Code:
test=*# select * from tfragen except select * from tfragen where cid in (select tfragen_id from tinhalte where tlisten_id = (select cid from tanlagen where cname = 'testliste'));
 cid | ctext | cantwort
-----+-------+----------
(0 rows)

Du hattest ja keine anderen Datensätze... ich füge mal einen ein und wiederhole die Abfrage:

Code:
test=*# insert into tfragen values (2, 'kann MySQL EXCEPT?','Nein');
INSERT 0 1
test=*# select * from tfragen except select * from tfragen where cid in (select tfragen_id from tinhalte where tlisten_id = (select cid from tanlagen where cname = 'testliste'));
 cid |  ctext  | cantwort
-----+--------------------+----------
  2 | kann MySQL EXCEPT? | Nein
(1 row)

Funktioniert, stimmts?


Andreas
 
Hey danke erstmal für deine zeit und Hilfe!

Allerdings stehts unten schon "kann MySQL EXCEPT"? Nein^^..

Daher kann ichs ja scheinbar gar nicht nutzen oder wie sehe ich das?
 
Hey danke erstmal für deine zeit und Hilfe!

Allerdings stehts unten schon "kann MySQL EXCEPT"? Nein^^..

Daher kann ichs ja scheinbar gar nicht nutzen oder wie sehe ich das?

Ahh, Du hast wenigstens aufgepaßt. Gefällt mir ;-)

Tja. MySQL kann es nicht. Entweder steigst nun schnell auf PostgreSQL um, was sehr viele Vorteile hätte, oder versuchst es mit Alternativen Lösungen in MySQL wie z.B. hier beschrieben: http://stackoverflow.com/questions/16092353/error-when-using-except-in-a-query
 
Ja klar, wie soll mir sonst geholfen werden :D!

Nunja, habe mir nun folgendes zusammengeschustert
PHP:
mysql_query("SELECT tfragen.* FROM tfragen INNER JOIN tinhalte ON fragen.cid=tinhalte.tfragen_id WHERE tinhalte.tlisten_id='"$listenid"'")

Mal sehen ob es das gewünschte Ergebnis bringt, hatte vorher nie was mit JOINs etc. zu tun :0!
 
So sollte es auch gehen.

Du musst nur die "0" mit deiner Listen ID austauschen
Code:
SELECT tf.*
FROM tfragen tf
LEFT JOIN tInhalte ti ON tf.cid=ti.tfragen_id
AND ti.tlisten_id= 0
WHERE ti.tfragen_id IS NULL

Gruss

Bernd
 
Werbung:
Zurück
Oben