Aggregatfunktionen - immer Spalten nicht in der GROUP BY-Klausel enthalten
-
20-09-2019 - |
Frage
Ich habe eine Tabelle, die drei Felder hat (item_id, Quelle und Preis). (ITEM_ID, Quelle und Preis) zusammen, um die Primärschlüssel bilden.
item_id source price
------- ------- -----
1 paris 13
1 london 12
1 newyork 15
2 paris 22
2 london 15
2 newyork 14
Für jeden item_id mag ich den billigsten Ort wissen, um es zu bekommen, und der Preis, den ich an dieser Stelle zahlen. Für das obige Beispiel, würde Ich mag die folgende Ausgabe sehen:
item_id source price
------- ------- ---------
1 london 12
2 newyork 14
Gibt es eine einfache Möglichkeit, dies zu tun, ohne den Namen der Tabelle zweimal zu erwähnen? Ich verwende MySQL, so dass ich keine WITH-Klausel verwenden kann.
Ich habe an der verbundenen einen Blick genommen zwei-Abfrage Lösung in anderem Benutzer Frage ( Gruppe verknüpften Datensätze, aber bestimmte Felder aus nur dem ersten Datensatz ) holen, aber ich würde wirklich wie zu vermeiden, dass die Tabelle zweimal zu erwähnen. Das Problem ist, dass die einfache Tabelle in dieser Frage tatsächlich eine Inline-Ansicht in meinem eigentlichen Problem darstellt, das dauert ca. 5 Sekunden pro Anwendung zu erstellen, so dass ich hoffe, Alternativen zu finden.
Lösung
Hier ist eine Art und Weise, mit einem inneren mit dem niedrigsten Preis zu Filterreihe verbinden:
select i.*
from items i
inner join (
select item_id, min(price) as minprice
from items
group by item_id
) cheapest on i.price = cheapest.minprice
and i.item_id = cheapest.item_id
Wenn mehrere Quellen mit dem niedrigsten Preis sind, werden sie alle zeigen.
EDIT:. Da Ihre Frage erwähnt die Elemente anzuzeigen dauert lange aufzubauen, das Ergebnis in einer temporären Tabelle gespeichert werden könnte
create temporary table temp_items
as
select item_id, source, price from YourView
Und dann die Gruppierung Abfrage auf der temporären Tabelle ausführen. In MySQL ist eine temporäre Tabelle für die aktuelle Verbindung nur dann sichtbar und wird automatisch gelöscht, wenn die Verbindung geschlossen wird.
Andere Tipps
Ich weiß leider nicht MySQL-Daten und String-Konvertierung auswendig. Aber hier ist etwas, dass, wenn Sie es ein bisschen für die korrekte Syntax massiert mag Sie vielleicht überraschen:
SELECT
item_id,
source = Convert(varchar(30), Substring(packed, 5, 30)),
price = Convert(int, Substring(packed, 1, 4))
FROM
(
SELECT
item_id,
Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
FROM items
GROUP BY item_id
) X
Das ist sicherlich ein Hack. Es definitiv nicht in allen Fällen verwendet werden. Aber wenn die Leistung ist entscheidend, manchmal ist es lohnt sich.
finden Sie unter für weitere Informationen href="https://stackoverflow.com/questions/1055274/1060880">.