Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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
Mysql 分组、计数和位置_Mysql_Sql_Count_Group By_Where - Fatal编程技术网

Mysql 分组、计数和位置

Mysql 分组、计数和位置,mysql,sql,count,group-by,where,Mysql,Sql,Count,Group By,Where,我被难住了,抓挠着头。这一定很简单,但我没看到 假设我有四张桌子: video = id hastag = id, tag_id, video_id hasteam = id, team_id, video_id hasidol = id, idol_id, video_id 此数据集仅作为示例: video = (1), (2), (3) hastag = (1, 1, 1), (2, 1, 2), (3, 2, 3) hasteam = (1, 1, 1), (2, 1, 3), (3,

我被难住了,抓挠着头。这一定很简单,但我没看到

假设我有四张桌子:

video = id
hastag = id, tag_id, video_id
hasteam = id, team_id, video_id
hasidol = id, idol_id, video_id
此数据集仅作为示例:

video = (1), (2), (3)
hastag = (1, 1, 1), (2, 1, 2), (3, 2, 3)
hasteam = (1, 1, 1), (2, 1, 3), (3, 2, 2)
hasidol = (1, 1, 3)
此查询:

SELECT v.id ,
COUNT(vhtag.id),
COUNT(vhteam.id),
COUNT(vhidol.id)
FROM video v
LEFT JOIN hastag vhtag ON vhtag.video_id = v.id
LEFT JOIN hasteam vhteam ON vhteam.video_id = v.id
LEFT JOIN hasidol vhidol ON vhidol.video_id = v.id

WHERE
v.id <> 1
AND
(
  vhtag.tag_id IN (SELECT htt2.tag_id FROM hastag htt2 WHERE video_id = 1)
  OR
  vhteam.team_id IN (SELECT htt3.team_id FROM hasteam htt3 WHERE video_id = 1)
  OR
  vhidol.idol_id IN (SELECT htt4.idol_id FROM hasidol htt4 WHERE video_id = 1)
)
GROUP BY v.id

我也可以用在教义中,我当时很傻,忘了和他在一起。这是最佳方式吗?

尝试简化查询,例如用这种方式-

SELECT
  v.id,
  COUNT(vhtag.id),
  COUNT(vhteam.id),
  COUNT(vhidol.id)
FROM
  video v
LEFT JOIN (SELECT * FROM hastag WHERE video_id = 1) vhtag
  ON vhtag.video_id = v.id
LEFT JOIN (SELECT * FROM hasteam WHERE video_id = 1) vhteam
  ON vhteam.video_id = v.id
LEFT JOIN (SELECT * FROM hasidol WHERE video_id = 1) vhidol
  ON vhidol.video_id = v.id
WHERE
  v.id <> 1
GROUP BY
  v.id

尝试简化查询,例如以这种方式-

SELECT
  v.id,
  COUNT(vhtag.id),
  COUNT(vhteam.id),
  COUNT(vhidol.id)
FROM
  video v
LEFT JOIN (SELECT * FROM hastag WHERE video_id = 1) vhtag
  ON vhtag.video_id = v.id
LEFT JOIN (SELECT * FROM hasteam WHERE video_id = 1) vhteam
  ON vhteam.video_id = v.id
LEFT JOIN (SELECT * FROM hasidol WHERE video_id = 1) vhidol
  ON vhidol.video_id = v.id
WHERE
  v.id <> 1
GROUP BY
  v.id

您有一个问题,您的联接会导致每个团队内的交叉联接

最简单的方法是执行count distinct:

SELECT v.id , COUNT(distinct vhtag.id), COUNT(distinct vhteam.id),
       COUNT(distinct vhidol.id)
FROM video v LEFT JOIN
     hastag vhtag
     ON vhtag.video_id = v.id
     LEFT JOIN hasteam vhteam
     ON vhteam.video_id = v.id
     LEFT JOIN hasidol vhidol
     ON vhidol.video_id = v.id 

真正的解决方案是分别聚合每个值,然后将结果合并在一起。

您遇到的问题是,您的合并会导致每个团队内的交叉合并

最简单的方法是执行count distinct:

SELECT v.id , COUNT(distinct vhtag.id), COUNT(distinct vhteam.id),
       COUNT(distinct vhidol.id)
FROM video v LEFT JOIN
     hastag vhtag
     ON vhtag.video_id = v.id
     LEFT JOIN hasteam vhteam
     ON vhteam.video_id = v.id
     LEFT JOIN hasidol vhidol
     ON vhidol.video_id = v.id 

真正的解决方案是分别聚合每个值,然后将结果合并在一起。

请说出查询的预期结果或指定示例数据的结果。.抱歉,发布后已对问题进行了多次编辑。现在应该更清楚了。请提供所需的结果集。这可能会有帮助。请说出查询的预期结果或指定示例数据的结果。抱歉,在发布问题后,已经对其进行了多次编辑。现在应该更清楚了。请提供所需的结果集。这可能会有帮助。不幸的是,这不会返回任何行,而我在编辑中发布的连接会起作用。如果我大胆猜测,可能是因为您的联接基本上重叠了两个条件:video_id=1和video_id=v.id,这在本例中是相互矛盾的。不幸的是,这不会返回任何行,而我在编辑中发布的联接却起作用。如果我大胆猜测的话,可能是因为你的连接基本上是重叠的两个条件:video_id=1和video_id=v.id,这在本例中是矛盾的。这并不是实际发生的情况。抱歉,我知道我可能不是最擅长解释的,但请注意我的查询中有一个1,这是作为参数传递的视频id。这不仅仅是加入对v.id的攻击。查看我的编辑中的连接以了解我的意思。基本上,它创建了一个关系查找视频,这些视频共享至少一个的标签,也就是说,它们至少有三种标签类型中的一种的实例,与我在本例中使用的id作为参数的视频相同,1。这并不是实际发生的情况。抱歉,我知道我可能不是最擅长解释的,但请注意我的查询中有一个1,这是作为参数传递的视频id。这不仅仅是加入对v.id的攻击。查看我的编辑中的连接以了解我的意思。基本上,它创建了一个关系查找视频,这些视频共享至少一个has的标签,也就是说,它们至少有三种标签类型中的一种的实例,与我在本例中使用的id作为参数的视频相同,1。
SELECT v.id , COUNT(distinct vhtag.id), COUNT(distinct vhteam.id),
       COUNT(distinct vhidol.id)
FROM video v LEFT JOIN
     hastag vhtag
     ON vhtag.video_id = v.id
     LEFT JOIN hasteam vhteam
     ON vhteam.video_id = v.id
     LEFT JOIN hasidol vhidol
     ON vhidol.video_id = v.id