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