我很难过,抓挠我的头。它一定很简单,但我没有看到它。分组,计数和在哪里
比方说,我有四个表:
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
它给我的罪名“有”行不符合WHERE子句。例如,如果视频行只有一个视频标识为1的单个团队和一个完全不相关的标签,那么当它应该显示“公共标签时,它会给我”常用标签数:1,常用团队数:1“计数:0(因为它是一个不相关的标签),常用团队数:1“。
现在,只要我限制查询到只有一个“有”表,像这样:
SELECT v.id ,
COUNT(vhtag.id)
FROM video v
LEFT JOIN hastag vhtag ON vhtag.video_id = v.id
WHERE
v.id <> 1
AND
(
vhtag.tag_id IN (SELECT htt2.tag_id FROM hastag htt2 WHERE video_id = 1)
)
GROUP BY v.id
然后它的工作,但问题是,当我试图把一个以上的“有“表进入查询。我尝试过使用HAVING,但它不能识别“vhtag.tag_id”列。 我很明显在这里做错了什么,任何人都可以帮助我?
编辑:
这种作品:
LEFT JOIN hastag vhtag ON vhtag.video_id = v.id AND vhtag.tag_id IN (SELECT htt2.tag_id FROM hastag htt2 WHERE video_id = 1)
LEFT JOIN hasteam vhteam ON vhteam.video_id = v.id AND vhteam.team_id IN (SELECT htt3.team_id FROM hasteam htt3 WHERE video_id = 1)
LEFT JOIN hasidol vhidol ON vhidol.video_id = v.id AND vhidol.idol_id IN (SELECT htt4.idol_id FROM hasidol htt4 WHERE video_id = 1)
我可以使用,在学说太(我是哑巴,忘了关于使用)。这是最佳的方式吗?
请说出查询的预期结果或示例数据中指定的结果。 – pkmiec 2012-08-15 14:54:36
对不起,发布后已经编辑了几次问题。现在应该更清楚了。 – user1600837 2012-08-15 15:22:43
请提供所需的结果集。它可能有帮助。 – Devart 2012-08-16 05:06:03