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