5

这是我正在使用的查询:

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);

但是现在我得到了

您不能在 FROM 子句中指定目标表 'tkl' 进行更新

4

4 回答 4

10

WHERE子句在COUNT(*)计算之前应用,所以你需要 in 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_linkkeywords加入条件子句吗?mysql会给你任何错误吗?

于 2010-09-28T01:07:25.743 回答
3

您正在寻找分组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;
于 2010-09-28T01:08:33.700 回答
0

嵌套子查询是一个简单的解决方案。

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
于 2010-09-28T01:10:43.297 回答
0

试试这个

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 )
于 2010-09-28T01:14:14.333 回答