Использовать group by in и возвращать идентификатор строки - PullRequest
0 голосов
/ 16 сентября 2011

Для этой таблицы ...

id  type   food     price 
--------------------------
1   veg    carrot   10    
2   veg    turnip   11
3   fruit  bramble  6
4   fruit  rasp     4
5   fruit  current  9
...

Я могу вернуть максимальную цену самой дорогой еды для каждого типа еды, как это ...

select max(price) from tableName group by type;

Но я бы хотел вернуть идентификационный номер каждой строки, в которой содержится самая дорогая еда для каждого типа пищи. И вернуть один и только один ряд для каждого типа пищи. Т.е. вернуть это ....

id  
----
2
5 
...

Это упрощенная версия моей настоящей проблемы.

Ответы [ 3 ]

1 голос
/ 16 сентября 2011
SELECT id
FROM ( SELECT id, type
       FROM table
       ORDER BY price DESC) AS h
GROUP BY type
0 голосов
/ 16 сентября 2011

Этот ужасный запрос сработает, когда больше продуктов питания будет одного типа и цены.
Я бы вряд ли использовал это в производстве, так как это невозможно.

SELECT MIN(id) AS id 
FROM (
    SELECT t.id AS id, t.type
    FROM tableName t
    JOIN (
        SELECT MAX(price) AS m, type
        FROM tableName 
        GROUP BY type
    ) sub 
        ON sub.m=t.price AND sub.type=t.type
    ORDER BY id
) whatever
GROUP BY type
0 голосов
/ 16 сентября 2011
SELECT max(id) from
(SELECT t1.* FROM tableName t1 
JOIN (SELECT type, max(price) AS price FROM tableName GROUP BY type) t2 
ON t2.type = t1.type AND t2.price = t1.price) t3
GROUP BY userId;
...