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