2012-04-12 5 views
0

Я пытаюсь извлечь из таблицы значение, отображающее максимальное количество раз для каждого отдельного значения другого поля. Например, если набор данных был:mysql, значение которого имеет максимальное количество

a x 
a x 
a y 
b x 
b y 
c x 
c y 
c y 

запрос даст

a x 2 
b x 1 
c y 2 

Мои эксперименты используют следующее:

CREATE TABLE IF NOT EXISTS `maxcount` (
    `what` varchar(1) DEFAULT NULL, 
    `loc` varchar(1) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

и

INSERT INTO `maxcount` (`what`, `loc`) VALUES 
('a', 'x'), 
('a', 'x'), 
('a', 'y'), 
('b', 'x'), 
('b', 'y'), 
('c', 'x'), 
('c', 'y'), 
('c', 'y'); 

первой часть легко:

select what, loc, count(loc) howmany from maxcount group by what, loc; 

То, что я еще не понял, заключается в том, как использовать это, чтобы получить одну строку для каждого «что», показывающее значение loc, которое имеет максимальный счетчик и значение максимума.

Раствор НЕ:

select what, loc, max(howmany) from (
select what, loc, count(loc) howmany from maxcount group by what, loc) 
A group by what; 

Потому что она дает:

a x 2 
b x 1 
c x 2 

Ваше руководство с благодарностью принял!

Джордж

+0

Это обеспечивает решение: 'выбрать то, что, LOC, макс (howmany) большинство из ( выберите, что, loc, count (loc) howmany из группы maxcount тем, что, loc order by count (loc) desc) Группа, которой: ' – geoB

+0

Вы по-прежнему выбираете' loc' в своей внешней группе, агрегировано или в группе, поэтому не гарантируется возврат правильного результата. Это может работать нормально для упрощенной схемы, но вы столкнулись с проблемами с большой таблицей. – piotrm

+0

Спасибо. Я догадался, что мое решение не будет работать в моей реальной проблеме. – geoB

ответ

0

Проверить это ... для того, чтобы избежать ссылки на ту же группу результатов, я создал таблицу ... вы должны удалить его после выполнения обработки, или заменить maxcounttemp с (SELECT what, loc, count(loc) howmany FROM maxcount GROUP BY what, loc) as tblX я пытался сделайте это ВРЕМЕННО, но вы не сможете использовать его внутри подзапроса, если внешняя таблица такая же.

CREATE TABLE `maxcounttemp` (
    `what` varchar(1) DEFAULT NULL, 
    `loc` varchar(1) DEFAULT NULL, 
    `howmany` int DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO maxcounttemp (
    SELECT what, loc, count(loc) howmany FROM maxcount GROUP BY what, loc 
); 

SELECT mct.what, mct.loc, mct.howmany 
FROM maxcounttemp mct 
WHERE (mct.what, mct.howmany) IN (
    SELECT mct2.what, MAX(mct2.howmany) 
    FROM maxcounttemp mct2 
    WHERE mct2.what = mct.what 
    GROUP BY mct2.what 
) GROUP BY (mct.what); 

надеюсь, что это помогает ... иметь в виду, что BX или в равной степени возможны по этому запросу ...

+0

Спасибо. Я буду работать с этим. Большое спасибо – geoB

+0

Отлично, если это трюк, пожалуйста, отметьте его как ответ ... в противном случае, дайте мне знать, чего не хватает (возможно, избегая этой временной таблицы?), И я буду работать над ее исправлением;) – g3rv4

+0

Я здесь новый Я еще не получил уведомления и другие протоколы. Отмечено как ответ. Я создал его в своем приложении. С добавлением использования Engine = Memory я смог сократить время обработки (для этого и множество других запросов) пополам. Еще раз спасибо. g – geoB

Смежные вопросы