在分组前计算行数

时间:2017-08-24 07:09:08

标签: php mysql sql database mysqli

我希望在按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         |
    +--------------------+

以下是评论中建议的SQLFiddle:http://sqlfiddle.com/#!9/8b2975/1

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

尝试以下解决方案。

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

答案 2 :(得分:0)

只需计算 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;

答案 3 :(得分:0)

SELECT COUNT(DISTINCT a.id)

FROM article a

INNER JOIN article_category c ON a.id = c.article_id