MySQL Probleme mit Join

Hallo Experten,
ich fange gerade an MySQL zu lernen und habe mir zum Üben eine kleine Pseudonymen-DB geschrieben. Der Aufbau sieht so aus:

Tabelle person: 
pers\_id: int(10) unsigned NOT NULL auto\_increment
name: varchar(255)
vorname: varchar(255)
geb\_jahr: date
gest\_jahr: date

Tabelle varianten:
var\_id: int(10) unsigned NOT NULL auto\_increment
var\_name: varchar(255)
var\_vorname: varchar(255)
pers\_id: int(10)

Tab. person -> Tab varianten ist eine 1:n-Beziehung, d.h. eine Person kann viele Pseudonyme haben.
Gefüllt ist die Tab. person so:

1, '-ky', '', '1938-00-00', NULL
2, 'Christie', 'Agatha', '1890-00-00', '1976-00-00'
3, 'Ambesser', 'Axel von', '1910-00-00', '1988-00-00'
4, 'Crosby', 'Bing', '1904-00-00', '1977-00-00'
5, 'Dylan', 'Bob', '1941-00-00', NULL

und die Tabelle varianten so:

1, 'Bosetzky', 'Horst', 1
2, 'Miller', 'Agatha Mary Clarissa', 2
3, 'Oesterreich', 'Axel Eugen Alexander von', 3
4, 'Lillis', 'Harry', 4
5, 'Zimmermann', 'Robert Alan', 5

Man soll einen Namen eingeben können, egal ob Pseudonym oder echter Name, und erhält dann die Geburtsdaten. Leider funktioniert das nur in einer Richtung. Wenn ich nach Zimmermann frage

SELECT vorname, name, var\_name, geb\_jahr, gest\_jahr
FROM person, varianten
WHERE name = "Zimmermann"
OR var\_name = "Zimmermann"
AND varianten.pers\_id = person.pers\_id

erhalte ich das richtige Ergebnis:

Bob Dylan Zimmermann 1941-00-00 NULL

bei der gleichen Frage nach Dylan

SELECT vorname, name, var\_name, geb\_jahr, gest\_jahr
FROM person, varianten
WHERE name = "Dylan"
OR var\_name = "Dylan"
AND varianten.pers\_id = person.pers\_id

gibt es jedoch gleich 5 Ergebnisse:

Bob Dylan Bosetzky 1941-00-00 NULL
Bob Dylan Miller 1941-00-00 NULL
Bob Dylan Oesterreich 1941-00-00 NULL
Bob Dylan Lillis 1941-00-00 NULL
Bob Dylan Zimmermann 1941-00-00 NULL

Soviel glaube ich verstanden zu haben, daß es irgendwie mit Join zu tun hat, weiss aber trotzdem nicht, wo der Fehler in der Abfrage liegt. Kann mir bitte mal jemand einen Hinweis geben?

Vielen Dank schon mal
Jan

Hallo Jan,

eigentlich hast du die Lösung, es fehlt nur die Klammerung.

Nach dem

WHERE solltest du die IDs mit AND verbinden und dann:

AND ( name = ‚dylan‘ OR pseudo = ‚dylan‘ )

Ohne die Klammern wird die Verbindung "…id = …id " ja praktisch wieder aufgelöst, weil das OR ja auf der gleichen Ebene liegt.

Gruß Volker

SELECT vorname, name, var_name, geb_jahr, gest_jahr
FROM person, varianten
WHERE name = „Dylan“
OR var_name = „Dylan“
AND varianten.pers_id = person.pers_id

gibt es jedoch gleich 5 Ergebnisse:

was wäre denn wenn du auch AND ist stärker als OR beachten würdes.
da machts einem ja schon vom lesen her krank , nur weil wir von links nach recchts lesen , andere lesen von rechts nach links, und schon ist deine Formel ne andere lol.

WHERE varianten.pers_id = person.pers_id AND (name = „Dylan“ OR var_name = „Dylan“)

und am besten zuerst die Indexe , liest sich auch besser, erst den passenden index, dann den passenden namen.

vielleicht war es das schon :smile: Klamern sind wichtig um die abarbeitung der komponenten zu erhalten.

Auch wenn du nach einem Experten gefragt hast antworte ich mal ;p

Dein Join ist ein Kreuzprodukt das heist jedes Feld mit jedem aus beiden Tabellen. Mit deiner WHERE Klausel hast du NUR die Felder der varianten Tabelle beschränkt.
Du musst name = „Zimmermann“ OR var_name = „Zimmermann“ in Klammern setzen da dein boolscher Ausdruck so ausgewertet wird:
WHERE name = „Zimmermann“ OR
( var_name = „Zimmermann“ AND varianten.pers_id = person.pers_id )

Deswegen hast du als von der zweiten Tabelle selektiert hast nur einen Row zurückbekommen und auf der ersten alle fünf.

Mein Vorschlag:
SELECT vorname, name, var_name, geb_jahr, gest_jahr
FROM person
INNER JOIN varianten ON varianten.pers_id = person.pers_id
WHERE name = ‚name‘

SELECT vorname, name, var_name, geb_jahr, gest_jahr
FROM person, varianten
WHERE name = „Zimmermann“
OR var_name = „Zimmermann“
AND varianten.pers_id = person.pers_id

erhalte ich das richtige Ergebnis:

Bob Dylan Zimmermann 1941-00-00 NULL

bei der gleichen Frage nach Dylan

SELECT vorname, name, var_name, geb_jahr, gest_jahr
FROM person, varianten
WHERE name = „Dylan“
OR var_name = „Dylan“
AND varianten.pers_id = person.pers_id

gibt es jedoch gleich 5 Ergebnisse:

Bob Dylan Bosetzky 1941-00-00 NULL
Bob Dylan Miller 1941-00-00 NULL
Bob Dylan Oesterreich 1941-00-00 NULL
Bob Dylan Lillis 1941-00-00 NULL
Bob Dylan Zimmermann 1941-00-00 NULL

SELECT vorname, name, var_name, geb_jahr, gest_jahr
FROM person, varianten
WHERE name = „Dylan“
OR var_name = „Dylan“
AND varianten.pers_id = person.pers_id

gibt es jedoch gleich 5 Ergebnisse:

was wäre denn wenn du auch AND ist stärker als OR beachten
würdes.
da machts einem ja schon vom lesen her krank , nur weil wir
von links nach recchts lesen , andere lesen von rechts nach
links, und schon ist deine Formel ne andere lol.

Hi Rakon,

leider macht auch deine Antwort vom Ton her krank, auch wenn sie, was die Sache betrifft, „voll korrekt“ ist.

Ich vermute mal, die Fragen hier werden selten gestellt, um die Anderen hier zu ärgern oder zu erheitern (Ausnahmen gibt es bestimmt)

In diesem Sinne, sql rulz :wink:

Gruß Volker

Hallo Experten,
vielen Dank für die Antworten. Es waren tatsächlich „nur“ die Klammern… Jetzt läuft es so, wie es soll.
Wenn in der Frage etwas nicht so übersichtlich war, wie es sein sollte, ich gelobe Besserung. Es ist nicht so einfach, diese vielen Infos in eine halbwegs lesbare Form zu bringen. Und was die Reihenfolge der WHERE-Abfrage betrifft, so kam die in dieser Reihenfolge zustande, weil mein erster Versuch einfach nur
WHERE name = „Dylan“ OR var_name = „Dylan“
lautete und ich erst danach auf die Idee kam, daß auch noch die Schlüssel verglichen werden müssen.

Also nochmals vielen Dank an alle, die bemüht haben
Jan

OT^3: man bist du OT
du bist mir zu negative .
es macht vom lesen her krank , weil hier keine identifizierung herrscht und das liegt bei uns an dem von links nach rechts lesen, was bei den meisten logischen sprachen auch ist aber eben bei keywörtern anders.

Du machst aus jeder fliege einen hauffen scheisss…eee aber danke.

und ich sach leider nur die wahrheit ohne honig und ach nur die klammern setzen und wissen tut er immernoch nicht wann er sowas bemerken könnte , woran es liegt es …

DAS du meinst "krank " sei ein persöhnlich gemeinter ausdruck bezogen auf seine leistenung , dann muss ich sagen das du sehr sehr krank bist und deinen POSt gerne in dein Tagebuch schreiben kanns um mit dem psychater deienr wahl das mal durchzugehen.

willst du mich also noch mehr persöhnlich masszügeln dann bitte, poste weiter .

ich kannst mit syntax belegen, mathematisch, oder mal einfach mit klaren nachvollziehbahren worten, warum passiert ein solcher fehler :smile:

geanwortet hat er ja das es genau deswegen so passiert ist , und nächstes mal sieht er wie krank das zu lesen ist …

punkt komma strich, fühl dich beleidig oder nicht.

P.S. wenn du schon was an meiner art auszusetzen hast, dann PM , vorallem wenn du das so negativ deutes, denn ich habe ihn nicht beleidigt.

gute nacht Volker mal wieder .

Hi Rakon,

du brauchst Hilfe :wink:

Gruß und so