Hallo Vinzenz
SELECT <felder aus t1 und t2>, MIN(t1.wert*t2.wert) FROM tabelle AS t1, tabelle AS t2 GROUP BY t2.name;
Zusätzlich hatte ich davor geschrieben: "Also, meine Anfrage sieht prinzipiell so aus:"
Ich betone das prinzipiell!
das ist zunächst ein CROSS JOIN, das heißt:
Jede Zeile aus Tabelle t1 wird mit jeder Zeile aus t2 verknüpft.
Willst Du das wirklich?
Gibt es wirklich keine Join-Bedingung?
Ja, das will ich und selbstverständlich gibt es auch noch Join-Bedingungen, war aber für das Problem hier eher irrelevant.
Alle <felder aus t1 und t2> sollen ausgegeben werden, dabei sollen aus t1 alle Zeilen angezeigt werden, aus t2 aber nur die, für die das MIN zutrifft.
Verstehe ich Dich richtig: Join-Bedingung ist das Minimum des Produkts. Das erscheint mir wenig schlüssig. Somit müsste [...] Was soll das?
Die konkrete Bedingung ist auch eine andere. Auch hier greift das Argument "prinzipiell". Ich wollte nur die *Struktur* des Querys kommunizieren, nicht den Inhalt.
Bisher wird von t2 immer eine (aber die falsche) Zeile ausgegeben, das MIN an sich funktioniert wie gewünscht.
Du begehst einen Kardinalfehler, was MySQL angeht:
MySQL ist dokumentiert großzügig, was die Syntax beim Einsatz von Aggregatsfunktionen und GROUP BY angeht:Alle Werte in allen Spalten, über die weder gruppiert noch aggregiert wird, sind zufällig. Das möchtest Du wahrscheinlich nicht.
Exakt aufgefasst.
Wahrscheinlich ist die Lösung Deines Problems eine korrelierte Unterabfrage.
Tatsächlich enthält der Link genau die Lösung zu meinem Problem.
Aber da tut sich mir aber auch gleich das nächste Problem auf.
DROP TABLE IF EXISTS t;
CREATE TEMPORARY TABLE t ([...], d DOUBLE);
INSERT INTO t SELECT [...], t1.wert*t2.wert AS d FROM tabelle AS t1, tabelle AS t2 WHERE [...] HAVING d = ( SELECT MIN(t1.wert*t3.wert) FROM tabelle AS t3 WHERE [...] );
SELECT * FROM t ORDER BY d LIMIT 20;
Funktioniert wunderbar. Mache ich es aber ohne Temptabelle:
SELECT [...], t1.wert*t2.wert AS d FROM tabelle AS t1, tabelle AS t2 WHERE [...] HAVING d = ( SELECT MIN(t1.wert*t3.wert) FROM tabelle AS t3 WHERE [...] ) ORDER BY d LIMIT 20;
bekomme ich keine Ergebnisse mehr. Woran könnte das liegen? In Deinem Beispiel aus dem anderen Thread konnte ich das Verhalten leider nicht reproduzieren.
Gruß, Bodo