Seite 1 von 1
MySQL-Query: Wie kann ich folgenden Sachverhalt abbilden?
Verfasst: 03.03.2009, 13:27
von Southmedia
Vermutlich ist das ganze total einfach, aber ich komme gerade einfach nicht drauf wie ich das umsetzen könnte.
Ich habe 2 Tabellen a und b die folgendermaßen aussehen:
Tabelle a: id(PRIMARY) | name
Tabelle b: id(PRIMARY) | a_id(FOREIGN KEY AUF a) | typ | nummer
Ich möchte nun eine Liste von Namen aus a zu denen es in b noch keine Nummer vom Typ 'x' gibt.
Ideen?
- Jan
Verfasst: 03.03.2009, 13:39
von Southmedia
Ansatz:
Code: Alles auswählen
SELECT *
FROM a
LEFT JOIN b ON (a.id = b.a_id AND b.typ = 'x')
WHERE b.id IS NULL
Nur tut das auch genau das was ich denke?
- Jan
Verfasst: 03.03.2009, 13:57
von straka
ich mach das meistens so:
Code: Alles auswählen
select * from a,b where nummer is null and a.id=b.a_id
Verfasst: 03.03.2009, 14:08
von JohnBi
select a.name from a,b where b.typ!='x' AND a.id=b.a_id
das müsste das bewirken was du suchst...
Verfasst: 03.03.2009, 14:13
von Southmedia
straka hat geschrieben:ich mach das meistens so:
Code: Alles auswählen
select * from a,b where nummer is null and a.id=b.a_id
Das funktioniert leider nicht, da es ja durchaus Einträge mit Nummern in b zu dem Namen geben darf - nur eben nicht mit dem Typ 'x'.
JohnBi hat geschrieben:select a.name from a,b where b.typ!='x' AND a.id=b.a_id
das müsste das bewirken was du suchst...
Auch das reicht leider nicht - hier kriege ich ja nur die Namen zu denen es Nummern gibt, die nicht vom Typ 'x' sind. Namen ohne Nummern werden übergangen.
Verfasst: 03.03.2009, 14:19
von JohnBi
select a.name from a,b where b.typ!='x' AND a.id=b.a_id AND nummer=''
so, natürlich wäre nicht schlecht wenn du uns sagen würdest wie du "ohne Nummern" definierst ob da ne 0 drinne steht oder NULL oder nichts
Verfasst: 03.03.2009, 14:21
von net(t)worker
die Fragestellung ist ja garnicht so einfach, ich vermute fast das es nur über ein subrequest gehen wird...
das problem ist ja das es in b mehrere datensätze geben kann für jede id in a, also muss man ermitteln welche a_id einen datensatz für Typ=x haben und diese dann nicht ausgeben...
also in etwa so...
select * from a where id not in(select a_id from b where typ ="x"; );
da ich selber noch nie mit einem subrequest gearbeitet habe, kann ich nicht sagen ob es so auch geht oder die syntax richtig ist...
Verfasst: 03.03.2009, 14:27
von Southmedia
JohnBi hat geschrieben:select a.name from a,b where b.typ!='x' AND a.id=b.a_id AND nummer=''
Das Query dürfte eigentlich gar nix zurück liefern, denn es ist ja effektiv das vorige + die Einschränkung dass die Nummer leer sein muss.
JohnBi hat geschrieben:so, natürlich wäre nicht schlecht wenn du uns sagen würdest wie du "ohne Nummern" definierst ob da ne 0 drinne steht oder NULL oder nichts
Zwischen a und b bestehet eine 1-zu-n-Beziehung. 1 Name in a hat zwischen 0 und unendlich vielen Nummern in b zugeordnet (wobei jede Nummer von einem anderen Typ ist).
Verfasst: 03.03.2009, 14:32
von Southmedia
net(t)worker hat geschrieben:die Fragestellung ist ja garnicht so einfach, ich vermute fast das es nur über ein subrequest gehen wird...
das problem ist ja das es in b mehrere datensätze geben kann für jede id in a, also muss man ermitteln welche a_id einen datensatz für Typ=x haben und diese dann nicht ausgeben...
also in etwa so...
select * from a where id not in(select a_id from b where typ ="x"; );
da ich selber noch nie mit einem subrequest gearbeitet habe, kann ich nicht sagen ob es so auch geht oder die syntax richtig ist...
Natürlich... dummerweise muss das ganze auch auf MySQL 4.0.* laufen - also ohen Subqueries
Grundsätzlich hast du aber natürlich die beste Lösung: Erst alles aus a holen und dann alle Datensätze entfernen zu denen es schon eine Nummer vom Typ x gibt.
Mein Ansatz oben scheint aber zu funktionieren wie er soll. Siehe auch
https://dev.mysql.com/doc/refman/4.1/en ... eries.html
Verfasst: 03.03.2009, 14:45
von DZVO
Code: Alles auswählen
SELECT *
FROM a
LEFT JOIN b ON b.id = a.id AND b.typ = 'x'
WHERE a.id IS NULL
gibt dir nun alle a.id's zurück die in b nicht mit x markiert sind
Verfasst: 03.03.2009, 14:46
von Southmedia
DZVO hat geschrieben:Code: Alles auswählen
SELECT *
FROM a
LEFT JOIN b ON b.id = a.id AND b.typ = 'x'
WHERE a.id IS NULL
gibt dir nun alle a.id's zurück die in b nicht mit x markiert sind
Zeile 3 ist vermutlich ein Tippfehler und sollte b.a_id heißen, oder?
Wieso in Zeile 4 a.id?
Verfasst: 03.03.2009, 17:42
von DZVO
ja ja und ja

hier nochmals alles ganz sauber
Code: Alles auswählen
SELECT a.id
FROM a
LEFT JOIN b ON b.a_id = a.id AND b.typ = 'x'
WHERE b.a_id IS NULL
bei einer DB struktur die wie folgt aussieht
Table A
Code: Alles auswählen
id | textfield
1 | foo 1
2 | foo 2
3 | foo 3
4 | foo 4
Table B
mysql-output
id
2
4
das 2 nicht vorhanden und 4 typ == y ist und nicht x

Verfasst: 03.03.2009, 18:27
von Southmedia
Perfekt, entspricht ja meinen Ansatz den ich oben gepostet hatte
