MySQL Abfragen über 2 Table
Mika11
- php
Hi,
ich habe 2 Tables.
TABLE A hat die Spalten ID und NAME.
Beispiel:
ID | NAME
1 Hugo
2 Peter
3 Karl
4 Heinz
TABLE B hat die Spalten ID, REFERENZ und WORT.
Beispiel:
ID | REFERENZ | WORT
1 1 TRINKT
2 2 SCHLAEFT
3 3 HAT
4 3 GEHT
5 1 MOECHTE
6 1 WILL
Nun möchte ich eine Abfrage im Table A nach einer ID machen. Er soll den Table B mit der Referenz joinen. Sprich: Die Abhängigkeit der beiden Tables ist A.ID mit B.REFERENZ.
Soweit müsste das ja mit LEFT JOIN funktionieren. Nun aber mein eigentliches Problem:
1. Aber auch wenn kein passender Datensatz in B existiert, soll er mir zumindest die Daten von A zurückgeben.
2. Wenn mehrere Datensätze in B existieren, die zu einer ID in A gehören, dann soll er mir die GRÖßTE ID auswählen...
Ich versuch das mal an ein paar Beispielen zu erklären:
Ich selektiere die ID 2, dann ist es eindeutig und er gibt mir zurück:
A.ID=2 A.NAME=Heinz B.REFERENZ=2 B.WORT=SCHLAEFT
Ich selektiere nun die ID 1, dann gibt es mehrere Referenzen in B. Dort möchte ich jedoch nur den neusten:
A.ID=1 A.NAME=Hugo B.REFERENZ=1 B.WORT=WILL
Als letzes Beispiel selektiere ich die ID 4. Es gibt keine Referenz. Also möchte ich folgendes erhalten:
A.ID=4 A.NAME=Heinz B.REFERENZ=NULL B.WORT=NULL
So und nun sollte das Ganz ohne Subqueries funktionieren. Habt ihr Ideen?
Danke
yo,
- Aber auch wenn kein passender Datensatz in B existiert, soll er mir zumindest die Daten von A zurückgeben.
das löst schon der LEFT JOIN, den du gebildet hast. dabei wird immer der Datensatz aus tabelle a angezeigt, egal welchen inhalt tabelle b besitzt.
- Wenn mehrere Datensätze in B existieren, die zu einer ID in A gehören, dann soll er mir die GRÖßTE ID auswählen...
das könnte man mit unterabfragen lösen, wobei dabei die frage ist, welche version du von mysql benutzt. unterabfragen gehen bei mysql erst ab 4.1 und höher.
Ilja
Hi,
klar. Aber es werden mehrere Datensätze gebildet, wenn B mehr als eine Referenz hat... Ich würde die größte ID haben. Wenn möglich ohne SUBQUERIES.
yo,
klar. Aber es werden mehrere Datensätze gebildet, wenn B mehr als eine Referenz hat...
das ist auch der normale vorgang eines joins, dass sich je nach der join-bedingung mehrere datensätze miteinander "verbinden" und das nciht nur 1:1.
Ich würde die größte ID haben. Wenn möglich ohne SUBQUERIES.
grundsätzlich ist die größte id nicht immer ein guter ansatz. wenn du ein datumswert zur verfügung hast, nimm diesen. und ohne unterabfragen kann ich mir eine lösung noch nicht vorstellen, da du aggregat-funkionen wie MAX() einsetzen musst, was wiederum auswirkungen auf die auszugegeben spalten, bzw. die grippierung hat. welche version von mysql hast du den ?
Ilja
Hallo,
höher als 4.1. Trotzdem keine Subqueries... Geht aufgrund anderen Funktionen nicht. Das jetzt auszuführen wäre etwas aufwändig.
Hallo,
höher als 4.1.
Also, wir komen naeher....
V > 4.1.
Loes bitte mal diese Gleichung nach
X auf
V = X.
:-)
Gerade bei MySQL sind Versonsnummern hoechst wichtig !
Trotzdem keine Subqueries... Geht aufgrund anderen Funktionen nicht. Das jetzt auszuführen wäre etwas aufwändig.
Was ist daran aufwendig ? Poste doch bitte einfach die Query.
Gruesse
Holger
Hi,
muss auf alles > 4.1 laufen.
Es gibt keine Query... Ich frage nach der Query.. Aber sie soll OHNE Subqueries funktionieren...
yo,
muss auf alles > 4.1 laufen.
dann verstehe ich nicht, warum du keine unterabfragen verwenden kannst. ab 4.1 kann mysql diese und bei allen späteren versionen sowieso.
Ilja
Hallo Ilja,
muss auf alles > 4.1 laufen.
dann verstehe ich nicht, warum du keine unterabfragen verwenden kannst.
da sind wir schon mindestens zu dritt :-) Die Problemstellung ist der klassische Fall für ein Subselect. Einfach, gut, einfach gut. Schade, dass MySQL das erst ab 4.1 kann.
ab 4.1 kann mysql diese und bei allen späteren versionen sowieso.
Tja, zwei, drei Vorschläge hätte ich noch, der erste setzt MySQL 5.0 voraus:
Ein View mit der Maximumsquery und diesen View dann mit Tabelle A joinen (vergleiche mit der temporären Tabelle, die für 4.0 und älter vorgeschlagen wird). Dann gibt natürlich noch den uralten unperformanten häßlichen Würgherum "MAX-CONCAT trick", siehe
http://dev.mysql.com/doc/refman/4.1/en/example-maximum-column-group-row.html. Wie es mit vernünftigen DBMS geht, steht im Handbuch der Version 5.0, http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html - ohne irgendwelche Hinweise auf ehemalige Einschränkungen.
Warum Mika auf die vernünftigste Lösung, auf die Standardlösung, verzichten möchte, das kann ich nicht nachvollziehen. Es wäre sicherlich aufwendig, mit vielen Worten zu verschleiern, dass diese Einschränkung willkürlich und überflüssig ist.
Freundliche Grüße
Vinzenz
Weil diese Software nicht mit Subqueries arbeitet. Diese alte Software eines Vorgängers schleift sämtliche SQL Abfragen durch Funktionen, die diese Abfragen abändern. Abfragen, die jedoch Subqueries enthalten wandelt er falsch ab und es gibt eine fehlerhafte Abfrage.
Jetzt werden wieder tausend Fragen kommen: Wieso und weshalb macht man das?! Das bringt mir alles nichts. Warum und weshalb, weiß ich auch nicht. War halt eine dumme Idee eines Vorgängers, die nicht aus nur 20 Zeilen Code besteht, wo man mal schnell abändern könnte. Auf alle Fälle muss ich irgendwie Subqueries vermeiden....
yo,
Jetzt werden wieder tausend Fragen kommen: Wieso und weshalb macht man das?! Das bringt mir alles nichts.
nah, ich denke jetzt ist die verwirrung dies bezüglich aufgeklärt. zum einen kannst du dir ja mal die wie immer nützlichen tipps von Vinz anschauen. zum anderen würde ich entweder mit einer abfrage alle datensätze nach den bwenutzern aus aus tabelle a und der id (datum ist immer besser) der zweiten tabelle sortieren und dann den rest per programmcode erledigen, quasi nach einem datensatz pro user den rest "abschneiden".
oder aber du machst zwei abfragen draus, was auch nicht der performance-killer sein sollte. die erste sucht dir alle notwendigen id's der tabelle b raus SELECT MAX(id) from tabelle b GROUP BY referenz. und in der zweiten abfrage baust du diese ids in einem string durch kommata zusammen und benutzt ihn mit dem IN operator.
Ilja
Hallo Vinzenz !
Ein View mit der Maximumsquery und diesen View dann mit Tabelle A joinen
Deshalb hatte ich nach der Version gefragt....
Aber die rueckt sie ja nicht raus
Heerschaftzeitnsacrnochamal
:-)
Gruesse
Holger
yo,
höher als 4.1. Trotzdem keine Subqueries... Geht aufgrund anderen Funktionen nicht. Das jetzt auszuführen wäre etwas aufwändig.
wie gesagt, meiner meinung nach geht das ohne unterabfragen nicht, bzw. mir fällt keine lösung ein. auch nicht, wenn man ein wenig mit order by und limit experimeniert, kann ich mir keine lösung vorstellen. du wirst dich entweder von dem gedanken trennen müssen, es mit einer abfrage ohne unterabfragen hinzubekommen.
Ilja