1

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

第一个查询(有效):

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)

4

1 回答 1

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'
于 2012-11-03T10:38:18.657 回答