Sql 通过一对已知值对不同的行进行计数
我甚至不知道如何表达这个问题。我将给出示例内容和想要的输出,我正在寻找一个查询来实现这一点 假设我有一个名为“标记”的表,其中包含以下内容:Sql 通过一对已知值对不同的行进行计数,sql,join,distinct,Sql,Join,Distinct,我甚至不知道如何表达这个问题。我将给出示例内容和想要的输出,我正在寻找一个查询来实现这一点 假设我有一个名为“标记”的表,其中包含以下内容: content_id | user_id 1 | 1 1 | 2 1 | 3 2 | 1 2 | 3 2 | 4 3 | 2 3 | 3 4 | 1 4 | 2 5
content_id | user_id
1 | 1
1 | 2
1 | 3
2 | 1
2 | 3
2 | 4
3 | 2
3 | 3
4 | 1
4 | 2
5 | 1
6 | 1
6 | 4
我在内容ID之间有一个a对称关系:
master_content_id | slave_content_id
1 | 2
3 | 4
5 | 6
对于每个“主”内容_id(1、3和5),我想计算有多少不同的用户标记了主内容或从内容,但计算将两者标记为单个标记的人-这意味着在上面的示例中,内容_id=1由用户_id=1(作为内容_id=1和内容_id=2)和用户_id=2(作为内容_id=1)计算,按用户id=3(按内容id=1和内容id=2),按用户id=4(按内容id=2!)
我要进行的查询的输出示例如下:
content_id | user_count
1 | 4 # users 1, 2, 3, 4
3 | 3 # users 1, 2, 3
5 | 2 # users 1, 4
我不能假设相关的内容ID总是连续的奇数/偶数(即66可以是从属58的主)
我使用的是MySQL,不介意使用它对SQL的扩展(但是查询应该是ANSI,或者至少可以移植到大多数数据库)下面的查询对我来说很有用 我使用一个带有
UNION ALL
的子查询来处理映射内容,使其与直接内容相等
SELECT master_content_id AS content_id,
COUNT(DISTINCT user_id) AS user_count
FROM (
SELECT master_content_id, slave_content_id
FROM relationship
UNION ALL
SELECT master_content_id, master_content_id
FROM relationship
) r
JOIN flagged f ON ( f.content_id = r.slave_content_id )
GROUP BY master_content_id
结果:
content_id user_count
1 4
3 3
5 2
下面的问题对我有用 我使用一个带有
UNION ALL
的子查询来处理映射内容,使其与直接内容相等
SELECT master_content_id AS content_id,
COUNT(DISTINCT user_id) AS user_count
FROM (
SELECT master_content_id, slave_content_id
FROM relationship
UNION ALL
SELECT master_content_id, master_content_id
FROM relationship
) r
JOIN flagged f ON ( f.content_id = r.slave_content_id )
GROUP BY master_content_id
结果:
content_id user_count
1 4
3 3
5 2
从给出的示例来看,这是否完成了工作(我没有MySQL可供测试)
最好不要使用DISTINCT,但我看不到解决方法。从给出的示例来看,这是否可以完成任务(我没有MySQL可供测试)
最好不要使用DISTINCT,但我看不到解决方法。我认为这样的方法对您有效(虽然
GROUP\u CONCAT
是特定于MySQL的,但类似的连接可以在其他RDBMS中实现)
示例SQL FIDLE如下:
输出:
CONTENT_ID USERS USERLIST
1 4 #Users 1,2,3,4
3 3 #Users 1,2,3
5 2 #Users 1,4
我认为这样的东西对你会有用(虽然
GROUP\u CONCAT
是MySQL特有的,但在其他RDBMS中也可以实现类似的连接)
示例SQL FIDLE如下:
输出:
CONTENT_ID USERS USERLIST
1 4 #Users 1,2,3,4
3 3 #Users 1,2,3
5 2 #Users 1,4
不知道SQL Fiddle和GROUP_CONCAT。我实际上并不需要用户列表,这只是一个评论,但了解一些新的东西还是很好的:)我不知道SQL Fiddle和GROUP_CONCAT。实际上,我并不需要userlist,这只是一个注释,但了解一些新的东西还是很好的:)我最终使用了与此非常类似的东西-我没有使用内部查询,而是选择了ms.master\u content\u id,COUNT(不同的f.user\u id)和master\u slave ms JOIN在f.content\u id上标记f(ms.master\u content\u id,ms.slave\u content\u id)GROUP BY ms.master_content_idI最终使用了与此非常类似的东西—我没有使用内部查询:选择ms.master_content_id,COUNT(不同的f.user_id)和master_slave ms JOIN在f.content_id上标记f在ms.master_content_id(ms.master_content_id,ms.slave_content_id)GROUP BY BY ms.master_content_id这里有一些非常好的答案。在SQL中有一百万种方法可以做任何事情,这里有一些非常好的答案。实际上,在SQL中有一百万种方法可以做任何事情