MySQL5:

jeipack

Erfahrenes Mitglied
Hi Leute
Ich arbeite gerade an einer MySQL Abfrage und bekomme folgendes nicht richtig hin:

SQL:
select * from tbl_1
left join tbl_2 on tbl_2.fs_tbl1=tbl1.ID
bis hier hin ja kein Problem. Nun ist es aber so, dass in tbl_2 mehrere Datensätze auf die ID von tbl_1 kommen, ich aber nur den aktuellsten (durch ein DATETIME-Feld names zeitpunkt gekennzeichnet) will. Um diesen nur von tbl_2 zu bekommen würde ich es so machen:
SQL:
Select * from tbl_2
order by zeitpunkt desc
limit 1;

Wie bekomme ich das aber nun in den LEFT JOIN hinein ohne ein IN SELECT benutzen zu müssen?

Gruss und vielen Dank für eure Hilfe
jeipack
 
Hallo,

ohne Subselect ist das etwas umständlich, aber es geht:
SQL:
SELECT tbl_1.*, tbl_2_1.* FROM tbl_1
LEFT JOIN tbl_2 tbl_2_1 ON tbl_2_1.fs_tbl1 = tbl_1.ID
LEFT JOIN tbl_2 tbl_2_2 ON (tbl_2_2.fs_tbl1 = tbl_2_1.fs_tbl1 AND tbl_2_2.zeitpunkt > tbl_2_1.zeitpunkt)
WHERE tbl_2_2.fs_tbl1 IS NULL

Grüße,
Matthias
 
Hi Matthias
Das ist leider nicht ganz das was ich wollte. Folgende Probleme traten auf:
1. da es nicht blos 2 sondern theoretisch unendlich viele Einträge in tbl2 welche auf tbl1 referenzieren gibt, kommt nicht blos der aktuellste raus. (Man nehme an es gäbe 3 Einträge, jeweils einer mit zeitpunkt =1, 2, 3. Im ersten Join holt man alle 3 Datensätze, was auch gleich der Grund für Problem 2 ist. beim zweiten Join holt man nun noch 2 Datensätze, denn 2 ist kleiner als 3 und 1 ist kleiner als 2. Ich hoffe du verstehst meine Erklährung)
2. durch den join gibt diese Abfrage jetzt mehr als eine Zeile heraus, dies ist aber nicht so gewollt.


Aus performancegründen würde ich gerne auf einen IN SELECT / Subselect (heissen die offiziel so?) verzichten, doch wenns nicht anderst geht muss ich es wohl so machen.
Nun aber, soll ich das lieber als als Subselect oder als eigenständige Abfrage machen? Was wäre wohl performanter?

Gruss
 
Ach.. da es sich bei der Ausgabe ja eh um einen Einzeiler handelt, kann ich dieses "order by zeitpunkt desc limit 1" auch an die ganze Abfrage hängen.
Mein Problem hat sich also in Luft aufgelöst ^^

Ich lasse den Thread aber noch offen, da es mich trozdem interessiert, ob es eine Möglichkeit gibt die oben genannten Probleme zu umgehen.


MFG
jeipack
 
Das ist leider nicht ganz das was ich wollte. Folgende Probleme traten auf:
1. da es nicht blos 2 sondern theoretisch unendlich viele Einträge in tbl2 welche auf tbl1 referenzieren gibt, kommt nicht blos der aktuellste raus. (Man nehme an es gäbe 3 Einträge, jeweils einer mit zeitpunkt =1, 2, 3. Im ersten Join holt man alle 3 Datensätze, was auch gleich der Grund für Problem 2 ist. beim zweiten Join holt man nun noch 2 Datensätze, denn 2 ist kleiner als 3 und 1 ist kleiner als 2. Ich hoffe du verstehst meine Erklährung)
2. durch den join gibt diese Abfrage jetzt mehr als eine Zeile heraus, dies ist aber nicht so gewollt.
Komisch, diese Probleme treten bei mir nicht auf:
Code:
mysql> SELECT * FROM tbl_1;
+----+
| ID |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> SELECT * FROM tbl_2;
+----+---------+-----------+
| ID | fs_tbl1 | zeitpunkt |
+----+---------+-----------+
|  1 |       1 |         1 |
|  2 |       1 |         2 |
|  3 |       2 |         1 |
|  4 |       2 |         2 |
|  5 |       2 |         5 |
|  6 |       2 |         3 |
|  7 |       2 |         4 |
|  8 |       3 |         5 |
|  9 |       3 |        12 |
| 10 |       3 |         2 |
| 11 |       4 |         5 |
| 12 |       5 |         2 |
| 13 |       5 |         9 |
+----+---------+-----------+
13 rows in set (0.00 sec)

mysql> SELECT tbl_1.*, tbl_2_1.* FROM tbl_1
    -> LEFT JOIN tbl_2 tbl_2_1 ON tbl_2_1.fs_tbl1 = tbl_1.ID
    -> LEFT JOIN tbl_2 tbl_2_2 ON (tbl_2_2.fs_tbl1 = tbl_2_1.fs_tbl1 AND tbl_2_2.zeitpunkt > tbl_2_1.zeitpunkt)
    -> WHERE tbl_2_2.fs_tbl1 IS NULL;
+----+------+---------+-----------+
| ID | ID   | fs_tbl1 | zeitpunkt |
+----+------+---------+-----------+
|  1 |    2 |       1 |         2 |
|  2 |    5 |       2 |         5 |
|  3 |    9 |       3 |        12 |
|  4 |   11 |       4 |         5 |
|  5 |   13 |       5 |         9 |
+----+------+---------+-----------+
5 rows in set (0.02 sec)

Grüße,
Matthias
 
Oh du hast recht, vielen Dank für dieses Beispiel! Ich hatte es völlig falsch in meine Abfrage eingebaut (tbl_1 und tbl_2 waren nur Beispieltabellen)

Gruss und von mir ein [+] als Bewertung :)
 

Neue Beiträge

Zurück