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

Bei Suche 2 Tabellen verknüpfen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von tadeus, 25 April 2017.

  1. tadeus

    tadeus Benutzer

    Ich hab gerade folgende Herausforderung.

    Tabelle 1: Status
    sID(int) (primarykey)
    status (int)

    Tabelle 2: Nachrichten
    miD(int) (primarykey)
    sID(int)
    errorcode(int)

    Ich möchte jetzt alle Datenzeilen aus der Tabelle Status haben, welche im Feld status den Wert 2 haben und gleichzeitig in der Tabelle Nachrichten im Feld errorcode der Wert 99 und 98 ist. Wenn nur ein Wert von beiden drin ist oder es für die sID ein zusätzlicher Wert zB 66 drin ist, möchte ich die Datenzeile nicht haben.

    Also ich stell mir das plakativ so vor: SELECT * FROM Status s, Nachrichten n WHERE (s.status=2 and n.errorcode=99 & n.errrorcode = 98) UND Anzahl von n.errorcode für die sID = 2

    Wie löse ich sowas?

    Vielen Dank

    Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# create table status(sid int primary key, status int);
    CREATE TABLE
    test=*# create table nachrichten(mid int primary key, sid int references status, errorcode int);
    CREATE TABLE
    test=*# select * from status left join nachrichten on status.sid=nachrichten.sid where status.status=2 and nachrichten.errorcode in (98,99);
     sid | status | mid | sid | errorcode
    -----+--------+-----+-----+-----------
    (0 Zeilen)
    
    test=*#
    
    Bitte immer ordentliche JOIN-Syntax verwenden, und select * nur zum spielen, nicht aber produktiv.
     
  3. tadeus

    tadeus Benutzer

    Also das left join kann ich nachvollziehen, aber das IN gibt doch auch ein TRUE zurück wenn mehr als 98 und 99 vorhanden ist so wie ich das im Manual verstanden hab. Ich möchte nur ein TRUE wenn ausschließlich 98,99 vorhanden ist. Oder kann man da irgendwie ein count reinsetzen?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    was steht denn GENAU in errorcode? Hast Du da mehrere Werte, mit Komma getrennt, drin stehen?
     
  5. tadeus

    tadeus Benutzer

    Im errorcode sind int(10) Werte. Zahlen von 1 bis 100.000.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ahhh...

    Code:
    test=*# select * from status ;
     sid | status
    -----+--------
      1 |  2
      2 |  2
    (2 Zeilen)
    
    test=*# select * from nachrichten ;
     mid | sid | errorcode
    -----+-----+-----------
      1 |  2 |  98
      2 |  2 |  99
      3 |  2 |  100
      4 |  1 |  98
      5 |  1 |  99
    (5 Zeilen)
    
    test=*# select * from (select status.sid, array_agg(errorcode) from status left join nachrichten on status.sid=nachrichten.sid where status.status=2 group by status.sid) foo where array[98,99] @> array_agg;
     sid | array_agg
    -----+-----------
      1 | {98,99}
    (1 Zeile)
    
    test=*#
    
    Ist jetzt allerdings kein MySQL.
     
  7. drdimitri

    drdimitri Datenbank-Guru

    Code:
    select * from status
             where status=2
               and sid in(select sid from nachrichten where errorcode in(98,99)
                          minus
                          select sid from nachrichten where errorcode not in(98,99))
    
    PS: Tabellenname gleich Spaltenname - wieso macht man sowas?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Weil es geht. IMHO geht aber MINUS nicht in MySQL ;-)
     
  9. drdimitri

    drdimitri Datenbank-Guru

    Oracle sollte diese DB einfach einstampfen. Das würde einiges an Leid von der Welt nehmen...
     
    akretschmer gefällt das.
  10. akretschmer

    akretschmer Datenbank-Guru

    Ich denke mal, das geht nicht. Schon weil es diverse Forks gibt, auf die Oracle keine Macht hat.
     
  11. drdimitri

    drdimitri Datenbank-Guru

    Die aber bei weitem nicht die Verbreitung besitzen und z.T. auch schon deutliche Verbesserungen implementiert haben.
     
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