schwieriges mysql Select

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

schwieriges mysql Select

Beitrag von Liffi » 09.01.2009 22:59:11

Ich habe im Moment ein kleines Problem bei einem mysql Select.
Die (vereinfachte) Situation:
Tabelle 1 mit ID und Name, Tabelle 2 mit ID, einem Datum und einer ID die auf Tabelle 1 zeigt.

Ich möchte jetzt die Namen von allen Datensätzen aus Tabelle 1 haben, die in Tabelle 2 per ID erwähnt werden, aber nur jeweils das mit dem neuesten Datum.

Mein bisher bester Versuch ist ein:

Code: Alles auswählen

SELECT Tabelle1.Name, Tabelle2.Tabelle1ID from Tabelle1, Tabelle2 where Tabelle1.ID = Tabelle2.Tabelle1ID ORDER by Tabelle2.Date DESC 
Hier erhalte ich aber alle Einträge, nicht nur die neuesten.
Kennt jemand die richtige mysql magic um mir zu helfen?

Ich hoffe, ich habe das Problem trotz der späten Stunde noch richtig darlegen können und Tabelle2.Tabelle1ID ist nicht zu verwirrend...

Benutzeravatar
duese
Beiträge: 651
Registriert: 12.07.2006 15:27:20
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: schwieriges mysql Select

Beitrag von duese » 10.01.2009 00:20:58

Hab länger nicht mehr mit SQL gearbeitet, daher dies hier aus dem Stehgreif und ungeprüft:

Code: Alles auswählen

SELECT T1.Name, MAX(T2.Date) FROM T1 LEFT JOIN T2 ON T1.ID=T2.T1ID;
Eventuell die Syntax noch korrigieren...

Gruß,
Thomas

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 10.01.2009 09:22:48

duese hat geschrieben:Hab länger nicht mehr mit SQL gearbeitet, daher dies hier aus dem Stehgreif und ungeprüft:

Code: Alles auswählen

SELECT T1.Name, MAX(T2.Date) FROM T1 LEFT JOIN T2 ON T1.ID=T2.T1ID;
Eventuell die Syntax noch korrigieren...
schonmal danke für die Hilfe.
Wenn ich den Befehl richtig verstehe, gibt er jetzt nur noch den Eintrrag mit dem größten Datum aus.

Mein Wunsch wäre es, wenn es in T2 mehrere Einträge mit der gleichen T1ID gibt, dann soll davon nur der mit dem MAX (T2.Date) angezeigt werden.
Aber es sollen für jede verschiedene T1ID in T2 ein Eintrag angezeigt werden.

Benutzeravatar
duese
Beiträge: 651
Registriert: 12.07.2006 15:27:20
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: schwieriges mysql Select

Beitrag von duese » 10.01.2009 11:25:48

Quasi der "letzte Zugriff" oder so?

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 10.01.2009 14:20:21

duese hat geschrieben:Quasi der "letzte Zugriff" oder so?
ich mach am besten mal ein Beispiel.

Code: Alles auswählen

mysql> select * from t1;
+------+-------+
| ID   | Name  |
+------+-------+
|    1 | Hallo | 
|    2 | Huhu  | 
|    3 | Hi    | 
+------+-------+

mysql> select * from t2;
+------+------+------------+
| ID   | T1ID | Datum      |
+------+------+------------+
|    3 |    2 | 2008-11-12 | 
|    1 |    1 | 2008-12-12 | 
|    2 |    1 | 2008-10-12 | 
+------+------+------------+
Rausbekommen möchte ich: Hallo und Huhu und zwar auch in der Reihenfolge (Datum von t2.ID=2 ist "größer" als das von t2.ID=3)

Benutzeravatar
duese
Beiträge: 651
Registriert: 12.07.2006 15:27:20
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: schwieriges mysql Select

Beitrag von duese » 10.01.2009 18:23:13

Achso.

Dann müsste folgendes funktionieren:

Code: Alles auswählen

SELECT T1.Name FROM T1 LEFT JOIN T2 ON T1.ID=T2.T1ID ORDER BY T2.Date;
Gruß,
Thomas

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 11.01.2009 12:12:23

duese hat geschrieben:Achso.

Dann müsste folgendes funktionieren:

Code: Alles auswählen

SELECT T1.Name FROM T1 LEFT JOIN T2 ON T1.ID=T2.T1ID ORDER BY T2.Date;
Danke schön.
Jetzt muß ich nur noch ein DISTINCT nach SELECT reinwerfen und schon habe ich auch noch nur jeden Eintrag einmal. Danke für deine Hilfe

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 26.01.2009 21:10:39

Das ganze hat sich leider noch ein wenig verkompliziert. In T2 ist jetzt noch ein Flag (0,1) drin und alle Einträge, bei denen dieses Flag auf 1 steht sollen ignoriert werden.
Wenn ich einfach noch ein WHERE T2.Flag != 1 reinmache fallen alle T1 ohne zugehöriges T2 raus :-(.

Ich habe dann auch mal ganz naiverweise ein:

Code: Alles auswählen

SELECT T2.Date, T1.ID FROM T1, T2 WHERE (T2.Flag != 1) ORDER by T2.Date;
versucht. Leider scheint dann die Zuordnung des Datums zu der ID nicht mehr zu passen :-(.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 26.01.2009 22:04:55

ok, ich bin der Lösung schon nahe, aber es stimmt noch nicht ganz;

Code: Alles auswählen

SELECT DISCTINCT T1.ID FROM T1 LEFT JOIN T2 ON T1.ID = T2.T1ID WHERE ( T2.Flag = 0 or T2.Flag IS NULL) ORDER by TimePoint DESC;
Leider steht dann der Eintrag mit dem "höchsten" Datum ganz oben. Ein ASC würde aber dazu führen, daß die Einträge mit NULL als Datum vor den anderen stehen würden. Wünschenswert wäre eine Sortierung vom kleinsten zum größten Datum und danach erst die Einträge mit NULL.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: schwieriges mysql Select

Beitrag von Liffi » 28.01.2009 10:27:53

so ein wenig googlen hat wie so oft weitergeholfen :-):

Code: Alles auswählen

SELECT DISCTINCT T1.ID T2.Flag IS NULL as isnull FROM T1 LEFT JOIN T2 ON T1.ID = T2.T1ID WHERE ( T2.Flag = 0 or T2.Flag IS NULL)  ORDER by isnull ASC,  TimePoint ASC;

Antworten