6

考虑这张表(来自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

此 SQL 查询返回每种类型中最昂贵的商品:SELECT 类型、MAX(price) FROM products GROUP BY 类型

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

我还想为每一行获取属于上述最高价格的字段idname 。什么样的 SQL 查询会返回这样的表?

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
4

3 回答 3

6

编辑只是更新我的以满足明确的要求

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
          )
于 2010-05-23T23:30:01.370 回答
6

这是greatest-n-per-group经常出现的问题。我通常的解决方法在逻辑上等同于@Martin Smith 给出的答案,但不使用子查询:

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;

我的解决方案和到目前为止在该线程上给出的所有其他解决方案都有机会为每个值生成多行type,如果多个产品共享相同的类型并且两者具有相同的价格,即最大值。有办法解决这个问题并打破平局,但你需要告诉我们在这种情况下哪个产品“获胜”。

您需要一些其他属性来保证在所有行中都是唯一的,至少对于具有相同type. 例如,如果Id价值较大的产品应该获胜,您可以这样解决平局:

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;
于 2010-05-24T00:11:12.843 回答
3

您可以使用子选择来完成

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))

或内部连接

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
于 2010-05-23T23:36:01.630 回答