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:
von

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

Code: Alles auswählen

a_id| typ
1	| x
3	| x
4	| y
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 :)