SQL - 与HAVING和COUNT()匹配

时间:2012-11-03 10:04:42

标签: sql count having-clause match-against

有人知道为什么第一个查询有效,而第二个查询没有?

第一个查询(有效):

SELECT *, 
       MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score
FROM (ci_users) HAVING _score > '0';

第二个查询(不工作):

SELECT COUNT(id), 
       MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score 
FROM (ci_users) HAVING _score > '0';

第一个查询正好返回24行,第二个查询返回0行,而我刚刚将*更改为COUNT(id)

1 个答案:

答案 0 :(得分:2)

第一个返回匹配的每一行。

第二个包含id上的聚合。

在聚合时,MySQL足够聪明(或者我应该说,足够愚蠢)隐式地从查询但未聚合的所有字段中选择任何值。因此,由于您没有按score进行分组而您没有聚合score,MySQL将只返回中间结果的所有记录的任何分数(在应用having之前) (包括那些值为0的子句)因此,这个中间结果可能只包含一个计数,例如900和_score为0.使用having过滤后,没有记录。

现在,我很乐意提出建议,但我不知道你真的希望从该查询中返回什么。

SELECT COUNT(id)
FROM
  (SELECT 
    id,
    MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) AS _score 
  FROM (ci_users) HAVING _score > '0') x;

甚至更好:

SELECT COUNT(id)
FROM (ci_users) 
WHERE MATCH(username) AGAINST ('ergergergergergerg' IN BOOLEAN MODE) > '0'