Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

MySQL-Query: Wie kann ich folgenden Sachverhalt abbilden?

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 13:27

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

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 13:39

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

straka
PostRank 1
PostRank 1
Beiträge: 21
Registriert: 27.11.2008, 15:45

Beitrag von straka » 03.03.2009, 13:57

ich mach das meistens so:

Code: Alles auswählen

select * from a,b where nummer is null and a.id=b.a_id 

JohnBi
PostRank 10
PostRank 10
Beiträge: 2957
Registriert: 22.02.2009, 20:31

Beitrag von JohnBi » 03.03.2009, 14:08

select a.name from a,b where b.typ!='x' AND a.id=b.a_id

das müsste das bewirken was du suchst...
Probleme mit Google & Co.? Hier die Lösung! - Linktausch?! | Projekt kaufen?! |
-------------------------------------------
Der PostRank und das Anmeldedatum stehen in keinem Verhältnis zur Qualität der Antworten einiger User. {JohnBi, 2009}

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 14:13

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.
Zuletzt geändert von Southmedia am 03.03.2009, 14:16, insgesamt 1-mal geändert.

JohnBi
PostRank 10
PostRank 10
Beiträge: 2957
Registriert: 22.02.2009, 20:31

Beitrag von JohnBi » 03.03.2009, 14:19

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
Probleme mit Google & Co.? Hier die Lösung! - Linktausch?! | Projekt kaufen?! |
-------------------------------------------
Der PostRank und das Anmeldedatum stehen in keinem Verhältnis zur Qualität der Antworten einiger User. {JohnBi, 2009}

Anonymous

Beitrag von Anonymous » 03.03.2009, 14:21

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

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 14:27

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).

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 14:32

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

DZVO
PostRank 6
PostRank 6
Beiträge: 476
Registriert: 27.12.2005, 04:44

Beitrag von DZVO » 03.03.2009, 14:45

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
kuckst du oder schluckst du .... | FollowTheMillion sag ich nur :)

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 14:46

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?

DZVO
PostRank 6
PostRank 6
Beiträge: 476
Registriert: 27.12.2005, 04:44

Beitrag von DZVO » 03.03.2009, 17:42

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 :)
kuckst du oder schluckst du .... | FollowTheMillion sag ich nur :)

Southmedia
PostRank 10
PostRank 10
Beiträge: 7322
Registriert: 20.07.2003, 19:56

Beitrag von Southmedia » 03.03.2009, 18:27

Perfekt, entspricht ja meinen Ansatz den ich oben gepostet hatte :)

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag