【问题标题】:Count Rows before Group By在分组依据之前计算行数
【发布时间】:2017-08-24 07:09:07
【问题描述】:

我想在按 id 分组后计算文章的数量(预期:2),但它目前只返回带有1 的行,因为它计算 GROUP BY 之后的出现次数。

    article:
    +-------+---------+
    |  id   |  name   |
    +-------+---------+
    |   1   |  Apple  |
    |   2   |  Orange | 
    |   3   |  Peaches| 
    +-------+---------+


    article_category:
    +---------------+----------------+
    |  article_id   |  category_id   |
    +---------------+----------------+
    |       1       |        1       |
    |       1       |        2       |
    |       1       |        3       |
    |       2       |        1       |
    +---------------+----------------+

这可以在没有子查询和不使用SQL_CALC_FOUND_ROWS 的情况下完成吗? (因为我使用的是 API 端点,所以我受到了很大的限制)。我唯一的另一个想法是简单地检索所有 id,然后用 PHP 计算它们。

这是我当前的查询:

SELECT COUNT(DISTINCT a.id) as number_articles
FROM article a
INNER JOIN article_category c ON a.id = c.article_id
WHERE c.category_id IN (1, 2, 3)
GROUP BY a.id;

期望的输出:

    +--------------------+
    |  number_articles   | 
    +--------------------+
    |          2         |
    +--------------------+

这是 cmets 中建议的 SQLFiddle:http://sqlfiddle.com/#!9/8b2975/1

【问题讨论】:

  • 顺便说一句,这是一个内部连接
  • 感谢您的反馈,我创建了一个 SQLFiddle 并调整了查询​​。
  • @Elektropepi,您的预期结果是什么?
  • 你可以那样做吗?正如您所说的子查询: SELECT COUNT(DISTINCT id) FROM (SELECT a.id, a.name FROM article a INNER JOIN article_category c ON a.id = c.article_id WHERE c.category_id IN (1, 2, 3) GROUP BY a.id)x;

标签: php mysql sql database mysqli


【解决方案1】:

基于您现在添加的预期结果。您可以删除 GroupBy,它在这里确实没有太大的作用,这应该可以:

select count(distinct a.id)
from article a
INNER JOIN article_category c ON a.id = c.article_id
WHERE c.category_id IN (1, 2, 3)

【讨论】:

  • 感谢您的回答,我编辑了我的问题:我需要检索2 的文章数量,这也无法通过此查询:sqlfiddle.com/#!9/8b2975/14
  • 您能否像对表格内容所做的那样发布一个预期输出的小表格,如果您这样做应该很快就能解决。
【解决方案2】:

尝试以下解决方案。

select count(DISTINCT a.id) as total
from article a
INNER join article_category c on a.id = c.article_id 
WHERE category_id in (1,2,3);

结果:

total
2

【讨论】:

  • 如果您将LEFT 更改为INNER JOIN,则可以。谢谢。
【解决方案3】:

只计算 c.category_id 的值而不是 a.id

SELECT COUNT(c.category_id) FROM article a INNER JOIN 
article_category c ON a.id = c.article_id WHERE c.category_id 
IN (1, 2, 3) GROUP BY a.id;

【讨论】:

    【解决方案4】:
    SELECT COUNT(DISTINCT a.id)
    
    FROM article a
    
    INNER JOIN article_category c ON a.id = c.article_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 2014-04-23
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多