Mailinglisten-Archive |
Sven Letzel schrieb am Mittwoch, den 14. Juli 1999: > Wahrscheinlich muß man hier geschickt einen SELF-JOIN einsetzen, aber wegen > des "group by" bin ich noch zu keinem brauchbaren Ergebnis gekommen. Hier eine Lösung, die Du sicher nicht verwenden willst: ;-) SELECT SUBSTRING_INDEX(SUBSTRING_INDEX( MAX(CONCAT(f2,'.',t1.id,'.',f3)) ,'.',-2),'.',1) AS id ,f1 ,SUBSTRING_INDEX( MAX(CONCAT(f2,'.',t1.id,'.',f3)) ,'.', 1) AS f2 ,SUBSTRING_INDEX( MAX(CONCAT(f2,'.',t1.id,'.',f3)) ,'.',-1) AS f3 FROM TABLE1 AS t1 ,TABLE2 AS t2 WHERE t1.id = t2.id GROUP BY f1 ; Der Trick ist hier also ein wörtlich genommenes Anhängen der anderen Felder ... :) Da es noch keine Sub-Selects gibt, geht's in MySQL meines Wissens nicht schöner, wenn man unbedingt bei _einer_ SQL-Anfrage bleiben will. Ansonsten muß man mit temporären Tabellen arbeiten: CREATE TABLE temp ( f1 INT, f2max INT ); INSERT INTO temp SELECT f1, MAX(f2) FROM TABLE1 GROUP BY f1; SELECT t1.id, t1.f1, t1.f2, t2.f3 FROM TABLE1 AS t1, TABLE2 AS t2, temp WHERE t1.f1 = temp.f1 AND t1.f2 = temp.f2max AND t1.id = t2.id; DROP TABLE temp; Und wenn Dir wegen der Datenkonsistenz unwohl ist (es könnte sich ja theoretisch zwischen dem INSERT und dem SELECT etwas an den Daten ändern), dann verwende noch zusätzlich Lese- und Schreibsperren: CREATE TABLE temp ( f1 INT, f2max INT ); LOCK TABLES TABLE1 AS t1 READ, TABLE2 AS t2 READ, temp WRITE; INSERT INTO temp SELECT f1, MAX(f2) FROM TABLE1 AS t1 GROUP BY f1; SELECT t1.id, t1.f1, t1.f2, t2.f3 FROM TABLE1 AS t1, TABLE2 AS t2, temp WHERE t1.f1 = temp.f1 AND t1.f2 = temp.f2max AND t1.id = t2.id; UNLOCK TABLES; DROP TABLE temp; Ciao, Martin -- Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://home.pages.de/~ramsch/ > PGP KeyID=0xE8EF4F75 FiPr=52 44 5E F3 B0 B1 38 26 E4 EC 80 58 7B 31 3A D7 --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive