【问题标题】:SQL - MATCH AGAINST with HAVING and COUNT()SQL - 与 HAVING 和 COUNT() 匹配
【发布时间】:2012-10-23 20:54:01
【问题描述】:

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

第一个查询(有效):

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)

【问题讨论】:

    标签: sql count having-clause match-against


    【解决方案1】:

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

    第二个包含关于 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-12
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2021-04-25
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多