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.

War es hilfreich?

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">.

scroll top