Frage

Betrachten Sie diese Tabelle (von http://www.tizag.com/mysqlTutorial/mysqlmax. php ):

Id     name               type     price 
123451 Park's Great Hits  Music    19.99 
123452 Silly Puddy        Toy      3.99 
123453 Playstation        Toy      89.95 
123454 Men's T-Shirt      Clothing 32.50 
123455 Blouse             Clothing 34.97 
123456 Electronica 2002   Music    3.99 
123457 Country Tunes      Music    21.55 
123458 Watermelon         Food     8.73

Diese SQL-Abfrage gibt das teuerste Element von jeder Art: SELECT-Typ, MAX (Preis) FROM Produkte GROUP BY Typ

Clothing $34.97
Food     $8.73
Music    $21.55
Toy      $89.95

Ich möchte auch die Felder id und Namen bekommen, die gehören in den oben max Preis für jede Zeile. Was SQL-Abfrage wird eine Tabelle wie diese Rückkehr?

Id     name            type      price
123455 Blouse          Clothing  34.97
123458 Watermelon      Food      8.73
123457 Country Tunes   Music     21.55
123453 Playstation     Toy       89.95
War es hilfreich?

Lösung

Dies ist das greatest-n-per-group Problem, das häufig aufkommt. Mein üblicher Weg, um es zu lösen, ist logisch äquivalent zu der Antwort von @ Martin Smith gegeben, aber nicht verwendet eine Unterabfrage:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND T1.price < T2.price)
WHERE T2.price IS NULL;

Meine Lösung und alle auf diesem Thread gegeben andere so hat bis jetzt eine Chance zu produzieren mehrere Zeilen pro Wert von type, wenn mehr als ein Produkt teilt die gleiche Art und beide einen gleichen Preis haben, ist der max. Es gibt Möglichkeiten, dieses Problem zu beheben und die Krawatte zu brechen, aber Sie müssen uns sagen, welches Produkt „gewinnt“ in Fall so.

Sie müssen einige andere Attribute, die garantiert über alle Zeilen eindeutig sein, zumindest für die Zeilen mit dem gleichen type. Zum Beispiel soll, wenn das Produkt mit dem größeren Id Wert gewinnen, können Sie die Krawatte auf diese Weise lösen:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1
LEFT OUTER JOIN Table T2
  ON (T1.type = T2.type AND (T1.price < T2.price
       OR T1.price = T2.price AND T1.Id < T2.Id))
WHERE T2.price IS NULL;

Andere Tipps

Edit Just updating mine to meet the clarified requirement

SELECT Id, name, type,price 
FROM Table T1
WHERE NOT EXISTS(
          SELECT * FROM TABLE T2 
          WHERE T1.type=t2.type 
          AND T2.Price >= T1.Price 
          AND T2.Id > T1.Id
          )

You can do it with a subselect

SELECT id, name, type, price FROM products p1
WHERE EXISTS (Select type, max(price) FROM Products p2 
              GROUP BY type
              WHERE p1.type=p2.type AND p1.price=p2.MAX(price))

or an inner join

SELECT id, name, type, price FROM products p1
INNER JOIN (Select type, max(price) FROM Products p2 GROUP BY type) maxPrice
         ON maxPrice=price=p1.price AND maxPrice.type=p1.price
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top