2015-01-06 3 views
1

* Ни один из других доступных ответов не решить мою проблемуКак выбрать строку с максимальным значением для столбца в MySQL?

У меня есть таблица т, как этот

id,cc,count 
'1','HN','22' 
'1','US','18' 
'1','VN','1' 
'2','DK','2' 
'2','US','256' 
'3','SK','1' 
'3','US','66310' 
'4','UA','2' 
'4','US','263' 
'6','FR','7' 
'6','US','84' 
'9','BR','3' 

Я хочу, чтобы получить строки для идентификаторов с максимальным числом, как показано ниже:

id,cc,count 
'1','HN','22' 
'2','US','256' 
'3','US','66310' 
'4','US','263' 
'6','US','84' 
'9','BR','3' 

Мой текущий код такой, но я не получаю ожидаемых результатов:

SELECT t.* FROM t 
    JOIN (
     SELECT 
    t.id,t.cc 
    ,max(t.count) as max_slash24_count 
    FROM t 
    group by t.id,t.cc 
    ) highest 
    ON t.count = highest.max_slash24_count 
    and t.cc = highest.cc 

Может кто-нибудь мне помочь?

+2

Похоже, вам нужно удалить группу из 't.cc' из подзапроса, а затем присоединиться к вашей таблице на' max_slash24_count' и 'id'. – Taryn

+1

Просто удалите ссылки на 't.cc' из запроса inline view (из предложения GROUP BY и списка SELECT), тогда ваш запрос будет полезен. Если для данного идентификатора имеется более одной строки с таким же самым высоким значением 'count', ваш запрос вернет все строки с тем же самым самым высоким значением' count'. Если вы хотите, чтобы только одна строка возвращалась на значение 'id', вам нужно добавить' GROUP BY t.id' по самому внешнему запросу. – spencer7593

ответ

2

Удалить CC столбец из group by. Попробуй это.

SELECT t.* FROM t 
    JOIN (
     SELECT 
    t.id 
    ,max(t.count) as max_slash24_count 
    FROM t 
    group by t.id 
    ) highest 
    ON t.count = highest.max_slash24_count 
    and t.id= highest.id 
+0

Спасибо @NoDisplayName. Это все еще не работает, потому что я вижу две строки для одного id. – UserYmY

+0

@ user2058811 это работает правильно (проверьте http://sqlfiddle.com/#!2/3ede69/3) –

+0

@ Andrey количество строк, которые я получаю в результате, больше, чем таблицы, отличные от столбцов столбца id. Вот как я знаю, что что-то не так – UserYmY

1

Попробуйте это:

create table t (id varchar(10), cc varchar(10), count varchar(10)) 

insert into t (id,cc,count) values ('1','HN','22'); 
insert into t (id,cc,count) values ('1','US','18'); 
insert into t (id,cc,count) values ('1','VN','1'); 
insert into t (id,cc,count) values ('2','DK','2'); 
insert into t (id,cc,count) values ('2','US','256'); 
insert into t (id,cc,count) values ('3','SK','1'); 
insert into t (id,cc,count) values ('3','US','66310'); 
insert into t (id,cc,count) values ('4','UA','2'); 
insert into t (id,cc,count) values ('4','US','263'); 
insert into t (id,cc,count) values ('6','FR','7'); 
insert into t (id,cc,count) values ('6','US','84'); 
insert into t (id,cc,count) values ('9','BR','3'); 

select * 
from t 
where exists (
    select * 
    from t as t1 
    group by t1.id 
    having t1.id = t.id and max(t1.count) = t.count 
) 

Результат

ID CC COUNT 
------------- 
1 HN 22 
2 US 256 
3 US 66310 
4 US 263 
6 US 84 
9 BR 3 

Проверить SQLFiddle

+0

@ Andrey, что здесь t1? – UserYmY

+0

извините (опечатка) - исправлено –

0

Этот вопрос был много раз на SO. Запрос такой простой:

SELECT m.id, m.cc, m.count 
FROM t m       # "m" from "max" 
    LEFT JOIN t b    # "b" from "bigger" 
     ON m.id = b.id   # match a row in "m" with a row in "b" by `id` 
     AND m.count < b.count # match only rows from "b" having bigger count 
WHERE b.count IS NULL   # there is no "bigger" count than "max" 

Настоящая проблема в вашем вопросе касается типов столбцов. Если count - char (а не int), то сравнение строк происходит с использованием порядка словаря, а не числового порядка.

Например, если третья строка гласит:

'1','VN','123' 

вы можете ожидать, что она будет выбрана в результате, потому что 123 больше, чем 22. Этого не происходит, потому что, как строка, '123' меньше, чем '22'.

0

Даже Тхо, это было уже ответили, используя ROW_NUMBER функциональность как в SQL Server является довольно весело и интересно: пожалуйста, посмотрите на этот запрос:

SELECT TT.Id, TT.cc, TT.count 
FROM (
SELECT t.cc 
    , t.count 
    , @row_number:=CASE WHEN @Id=Id THEN @row_number+1 ELSE 1 END AS row_number 
    , @Id:=Id AS Id 
FROM t, (SELECT @row_number:=0, @Id:='') AS temp 
ORDER BY t.Id, t.count DESC 
    ) AS TT 
WHERE TT.row_number = 1 
ORDER BY TT.Id; 

Он производит ожидаемый результат:

| Id | cc | count | 
|----|----|-------| 
| 1 | HN | 22 | 
| 2 | US | 256 | 
| 3 | US | 66310 | 
| 4 | US | 263 | 
| 6 | US | 84 | 
| 9 | BR |  3 | 

SQLFiddle

Я принял данные испытаний от @Andrey Morozov