Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过一对已知值对不同的行进行计数_Sql_Join_Distinct - Fatal编程技术网

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中有一百万种方法可以做任何事情