SQL-与HAVE和COUNT()匹配



有人知道为什么第一个查询有效,第二个查询不起作用?

第一个查询(工作):

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)

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

第二个包含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'

最新更新