Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Hilfe bei SQL Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Rootbob91, 22 Juli 2014.

  1. Rootbob91

    Rootbob91 Aktiver Benutzer

    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!!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
    ukulele gefällt das.
  3. Rootbob91

    Rootbob91 Aktiver Benutzer

    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?
     
    akretschmer gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

    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
     
  5. Rootbob91

    Rootbob91 Aktiver Benutzer

    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!
     
  6. ukulele

    ukulele Datenbank-Guru

    Du könntest auch mit NOT IN arbeiten, oder habe ich etwas verpasst?
     
  7. BerndB

    BerndB Datenbank-Guru

    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
     
  8. Rootbob91

    Rootbob91 Aktiver Benutzer

    Riesen Dank! Hat super geklappt!!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden