mysql где count (column_name) = 1? - PullRequest
       24

mysql где count (column_name) = 1?

5 голосов
/ 28 сентября 2010

Вот запрос, который я использую:

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5)
GROUP BY k_id;

Этот запрос возвращает что-то вроде
1 |6
2 |1
3 |4
4 |1
5 |9

Я хочу добавить что-то вроде AND COUNT(k_id) = 1, поэтому я получаю
2 |1
4 |1

Однако я получаю недопустимое использование групповой функции.

Как мне поступить?

Обновление:

Другая часть моего вопроса:

Можно ли это использовать как оператор удаления?

что-то вроде

DELETE FROM 
template_keyword_link tkl
LEFT JOIN keywords k
ON tkl.k_id = k.k_id
WHERE tkl.k_id 
IN(SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2)
GROUP BY k_id
HAVING k_count = 1);

Я получаю

В синтаксисе SQL есть ошибка;

Поэтому, основываясь на отзывах, я изменил это, чтобы использовать

DELETE tkl, k FROM 
template_keyword_link tkl
LEFT JOIN keywords k
ON tkl.k_id = k.k_id
WHERE tkl.k_id 
IN(SELECT k_id 
FROM template_keyword_link 
WHERE k_id IN(1,2)
GROUP BY k_id
HAVING COUNT(k_id) = 1);

Однако теперь я получаю

Вы не можете указать целевую таблицу 'tkl' дляобновление в предложении FROM

Ответы [ 4 ]

10 голосов
/ 28 сентября 2010
Предложение

WHERE применяется до вычисления COUNT(*), поэтому вам нужно ввести HAVING, которое применяется после.

  SELECT k_id,
         COUNT(k_id) AS k_count 
    FROM template_keyword_link 
   WHERE k_id IN (1, 2, 3, 4, 5)
GROUP BY k_id
  HAVING k_count = 1

См. Также: http://dev.mysql.com/doc/refman/5.1/en/select.html

** UPD **:

TIAS ;-) Кстати, запрос синтаксически кажется мне подходящим, НО Вы не забыли указать template_keyword_linkи keywords присоединиться к условию условия?MySQL дает вам ошибки?

3 голосов
/ 28 сентября 2010

Вы ищете предложение having, которое происходит после группировки (предложение where перед группировкой):

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5)
GROUP BY k_id
HAVING COUNT(k_id) = 1;
0 голосов
/ 28 сентября 2010

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

SELECT k_id, COUNT(k_id) AS k_count 
FROM template_keyword_link 
WHERE k_id IN(1,2,3,4,5)
GROUP BY k_id
HAVING ( COUNT(k_id) = 1 )
0 голосов
/ 28 сентября 2010

Вложенный подзапрос - простое решение.

SELECT * FROM 
  (
    SELECT k_id, COUNT(k_id) AS k_count 
    FROM template_keyword_link 
    WHERE k_id IN(1,2,3,4,5)
    GROUP BY k_id 
  ) inner
WHERE inner.k_count = 1
...