2013-07-23 1 views
0

Допустим, у меня есть таблица вроде этого:граф повторяющиеся значения - помочь моему MySQL запрос мертв медленно

Id*|value 

Для каждого Id Я хочу, чтобы подсчитать, сколько раз соответствующая value существует. Как и с этими данными выборки:

1, a 
2, b 
3, a 
4, b 
5, c 
6, a 

Я хочу:

1, a, 3 
2, b, 2 
3, a, 3 
4, b, 2 
5, c, 1 
6, a, 3 

Это то, что я прямо сейчас, и я считаю, что это работает, но он мертв медленно:

SELECT t1.Id, t1.value, COUNT(t2.value) FROM `table` AS t1 
LEFT JOIN `table` AS t2 ON (t1.value = t2.value) 
GROUP by t1.Id 

В моей таблице собраны тысячи строк. Любое предложение о том, как улучшить эту производительность?

+0

Ваш запрос тоже возвращается: 3, a, 1; 6, a, 1 и так далее ... peraphs медленный, потому что ваш результат неверен? –

+0

Ваш комментарий не имеет смысла? – Muleskinner

+0

Дорогой, вы написали свой результат, но некоторые кортежи не показывают. Поэтому я думаю, что вы подпрыгнули на некоторых из них. Таким образом, ваш запрос возвращает больше строк вашего аспектирования. –

ответ

1

Попробуйте

SELECT t1.Id, t1.value, t2.cnt FROM Table1 AS t1 
INNER JOIN 
(
    SELECT value, COUNT(value) as cnt 
    FROM Table1 GROUP BY value 
) AS t2 ON (t1.value = t2.value) 
ORDER BY t1.Id 

ИЛИ

SELECT t1.id,t1.value,COUNT(t2.id) AS cnt FROM Table1 AS t1 
INNER JOIN Table1 AS t2 
    ON t1.value = t2.value 
GROUP BY t1.id,t1.value 
ORDER BY t1.id 
0
SELECT t1.Id, t1.value, t2.value FROM `table` AS t1 
LEFT JOIN 
    (Select value, COUNT(value)` as value 
    from table` group by value) AS t2 
    ON  (t1.value = t2.value) 
GROUP by t1.Id 
1

левый присоединиться к нему с GROUP BY запроса, запускаемых на себе:

SQL Скрипки здесь - http://sqlfiddle.com/#!2/5b8f5/18

SELECT 
    tbl.id, tbl.value, cnts.counts FROM tbl 
LEFT JOIN ( 
    SELECT value, COUNT(value) AS counts FROM tbl GROUP BY value 
) AS cnts ON (tbl.value = cnts.value) 
Смежные вопросы