Bei Suche 2 Tabellen verknüpfen

tadeus

Benutzer
Beiträge
14
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
 
Werbung:
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.
 
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?
 
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.
 
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?
 
Werbung:
Zurück
Oben