Php 在SQL中使用SUM CASE

Php 在SQL中使用SUM CASE,php,sql,tsql,Php,Sql,Tsql,我正在构建一个站点,其中包含订阅的目标文章,并且这些文章也包含类别。我使用以下查询SQL查询来获取类别以及属于该类别的文章总数,如果您愿意,这将创建一个存档列表。 但是由于用户也有订阅,我想让归档只列出用户订阅的文章和计数 SELECT category.id, category.category, SUM(CASE WHEN category.id = article.category THEN 1

我正在构建一个站点,其中包含订阅的目标文章,并且这些文章也包含类别。我使用以下查询SQL查询来获取类别以及属于该类别的文章总数,如果您愿意,这将创建一个存档列表。 但是由于用户也有订阅,我想让归档只列出用户订阅的文章和计数

SELECT category.id, 
       category.category, 
       SUM(CASE WHEN category.id = article.category 
                      THEN 1 
                 ELSE 0 
            END) AS Number 
  FROM dbo.category 
       LEFT JOIN dbo.article 
            ON article.category=category.id 
       LEFT JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33'  
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 
这项工作做得很好。它提供了正确数量的所有文章,但是如果我尝试使用IN在查询中包含订阅,就像这样

SELECT category.id, 
       category.category, 
       SUM(CASE WHEN category.id = article.category 
                     THEN 1 
                ELSE 0 
           END) AS Number 
  FROM dbo.category 
       LEFT JOIN dbo.article 
            ON article.category=category.id 
       LEFT JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33' 
       AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 
所以我想要的输出是

Category 1           5 
Category 2           22
Category 3           56
等等。 然而,它对每个订阅都不止一次地计算文章数量,而且对每个类别的计算太多。 这里可以使用distinct吗?还是有更有效的方法编写此查询?

尝试以下方法:

SELECT category.id, 
       category.category, 
       COUNT(*) AS Number 
  FROM dbo.category 
       JOIN dbo.article 
            ON article.category=category.id 
       JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33' 
       AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 
试试这个:

SELECT category.id, 
       category.category, 
       COUNT(*) AS Number 
  FROM dbo.category 
       JOIN dbo.article 
            ON article.category=category.id 
       JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33' 
       AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 
试试这个:

SELECT category.id, 
       category.category, 
       COUNT(*) AS Number 
  FROM dbo.category 
       JOIN dbo.article 
            ON article.category=category.id 
       JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33' 
       AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 
试试这个:

SELECT category.id, 
       category.category, 
       COUNT(*) AS Number 
  FROM dbo.category 
       JOIN dbo.article 
            ON article.category=category.id 
       JOIN dbo.articleProfile 
            ON article.id = articleProfile.articleId 
 WHERE category.id != '33' 
       AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY 
       category.id, 
       category.category 
ORDER BY 
       category ASC 

首先:您正在外部连接表article和articleProfile,但是随后您明确地请求具有特定id的概要文件。因此,没有任何外部连接了。外部联接变成了内部联接,只是更加复杂。如果需要外部联接,请将条件从WHERE子句移动到ON子句。但是,在您的示例中,不需要外部联接

那么,回到你的问题上来。您要计算所选文章的数量。使用COUNT进行此操作。具有不同的:

SELECT 
  category.id, 
  category.category, 
  COUNT(DISTINCT article.id)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
INNER JOIN dbo.articleProfile ON article.id = articleProfile.articleId 
WHERE category.id != '33' 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY category.id, category.category 
ORDER BY category ASC;
或者不加入个人资料,这是我更喜欢的。但我想这只是个人喜好的问题

SELECT 
  category.id, 
  category.category, 
  COUNT(*)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
WHERE category.id != '33' 
AND EXISTS
(
  SELECT *
  FROM dbo.articleProfile 
  WHERE articleProfile.articleId = article.id 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
)
GROUP BY category.id, category.category 
ORDER BY category ASC;

首先:您正在外部连接表article和articleProfile,但是随后您明确地请求具有特定id的概要文件。因此,没有任何外部连接了。外部联接变成了内部联接,只是更加复杂。如果需要外部联接,请将条件从WHERE子句移动到ON子句。但是,在您的示例中,不需要外部联接

那么,回到你的问题上来。您要计算所选文章的数量。使用COUNT进行此操作。具有不同的:

SELECT 
  category.id, 
  category.category, 
  COUNT(DISTINCT article.id)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
INNER JOIN dbo.articleProfile ON article.id = articleProfile.articleId 
WHERE category.id != '33' 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY category.id, category.category 
ORDER BY category ASC;
或者不加入个人资料,这是我更喜欢的。但我想这只是个人喜好的问题

SELECT 
  category.id, 
  category.category, 
  COUNT(*)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
WHERE category.id != '33' 
AND EXISTS
(
  SELECT *
  FROM dbo.articleProfile 
  WHERE articleProfile.articleId = article.id 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
)
GROUP BY category.id, category.category 
ORDER BY category ASC;

首先:您正在外部连接表article和articleProfile,但是随后您明确地请求具有特定id的概要文件。因此,没有任何外部连接了。外部联接变成了内部联接,只是更加复杂。如果需要外部联接,请将条件从WHERE子句移动到ON子句。但是,在您的示例中,不需要外部联接

那么,回到你的问题上来。您要计算所选文章的数量。使用COUNT进行此操作。具有不同的:

SELECT 
  category.id, 
  category.category, 
  COUNT(DISTINCT article.id)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
INNER JOIN dbo.articleProfile ON article.id = articleProfile.articleId 
WHERE category.id != '33' 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY category.id, category.category 
ORDER BY category ASC;
或者不加入个人资料,这是我更喜欢的。但我想这只是个人喜好的问题

SELECT 
  category.id, 
  category.category, 
  COUNT(*)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
WHERE category.id != '33' 
AND EXISTS
(
  SELECT *
  FROM dbo.articleProfile 
  WHERE articleProfile.articleId = article.id 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
)
GROUP BY category.id, category.category 
ORDER BY category ASC;

首先:您正在外部连接表article和articleProfile,但是随后您明确地请求具有特定id的概要文件。因此,没有任何外部连接了。外部联接变成了内部联接,只是更加复杂。如果需要外部联接,请将条件从WHERE子句移动到ON子句。但是,在您的示例中,不需要外部联接

那么,回到你的问题上来。您要计算所选文章的数量。使用COUNT进行此操作。具有不同的:

SELECT 
  category.id, 
  category.category, 
  COUNT(DISTINCT article.id)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
INNER JOIN dbo.articleProfile ON article.id = articleProfile.articleId 
WHERE category.id != '33' 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
GROUP BY category.id, category.category 
ORDER BY category ASC;
或者不加入个人资料,这是我更喜欢的。但我想这只是个人喜好的问题

SELECT 
  category.id, 
  category.category, 
  COUNT(*)
FROM dbo.category 
INNER JOIN dbo.article ON article.category=category.id 
WHERE category.id != '33' 
AND EXISTS
(
  SELECT *
  FROM dbo.articleProfile 
  WHERE articleProfile.articleId = article.id 
  AND articleProfile.profileId IN ('1000000382','1000000388') 
)
GROUP BY category.id, category.category 
ORDER BY category ASC;

为什么需要外部连接?这不是一个只使用内部连接和计数而不是求和的情况吗?在这种情况下,我有点模糊,但他可能有一个条件-
WHERE
子句中的一个条件引用了
左连接
ed表,将其转换为
内部连接
(因为
null
值不满足该条件)。您可能希望以任何方式预先聚合文章(子查询表引用),这将使
orderby
更窄。我们可以得到一些示例开始数据(和表创建脚本)来和目标数据一起使用吗?为什么需要外部连接?这不是一个只使用内部连接和计数而不是求和的情况吗?在这种情况下,我有点模糊,但他可能有一个条件-
WHERE
子句中的一个条件引用了
左连接
ed表,将其转换为
内部连接
(因为
null
值不满足该条件)。您可能希望以任何方式预先聚合文章(子查询表引用),这将使
orderby
更窄。我们可以得到一些示例开始数据(和表创建脚本)来和目标数据一起使用吗?为什么需要外部连接?这不是一个只使用内部连接和计数而不是求和的情况吗?在这种情况下,我有点模糊,但他可能有一个条件-
WHERE
子句中的一个条件引用了
左连接
ed表,将其转换为
内部连接
(因为
null
值不满足该条件)。您可能希望以任何方式预先聚合文章(子查询表引用),这将使
orderby
更窄。我们可以得到一些示例开始数据(和表创建脚本)来和目标数据一起使用吗?为什么需要外部连接?这不是一个只使用内部连接和计数而不是求和的情况吗?在这种情况下,我有点模糊,但他可能有一个条件-
WHERE
子句中的一个条件引用了
左连接
ed表,将其转换为
内部连接
(因为
null
值不满足该条件)。您可能希望以任何方式预先聚合文章(子查询表引用),这将使
orderby
更窄。我们可以获得一些示例开始数据(和表创建脚本)以与目标数据一起使用吗?谢谢您的快速响应。我显然需要重新访问我的连接和sql。非常感谢。感谢您的快速回复。我显然需要再次访问m