我有这张桌子:
video_id tag_id
10 7
6 7
10 5
6 5
9 5
9 4
10 4
我想写一个查询,它会给video_id
tag_id
7和5 video_id
。因此应选择where tag_id IN (7, 5)
10和6,而不是9。
我尝试{{1}}条件,但显然包括9。
答案 0 :(得分:1)
它会对你有用吗?
SELECT video_id
FROM table1
WHERE tag_id iN (7,5)
GROUP BY video_id
HAVING COUNT(DISTINCT tag_id) =2;
<强>更新即可。
如果您对(video_id,tag_id)有唯一约束,则不需要COUNT(DISTINCT)
; COUNT(*)
也可以使用
答案 1 :(得分:1)
任意解决方案 -
下面是sql server的答案,使用mysql,你需要在video_id上使用count(),然后查找具有所需值的行。
我没有测试mysql但可以随意添加正确的mysql解决方案的编辑。
使用名为neededtag的表,其中一列(标签)包含您想要的列表
SELECT video_id
FROM
(
SELECT video_id,
row_number() OVER (PARTITION BY vidio_id ORDER BY video_ID) as RN
FROM table
JOIN neededtag ON tag_id = tag
) sub
WHERE RN = (SELECT COUNT(*) FROM neededtag)
或者您所需的标签可能有一个criteraname列......然后它会是这样的:
SELECT video_id
FROM
(
SELECT video_id,
row_number() OVER (PARTITION BY vidio_id ORDER BY video_ID) as RN
FROM table
JOIN neededtag ON tag_id = tag and criteraname = "friday tag list"
) sub
WHERE RN = (SELECT COUNT(*) FROM neededtag WHERE criteraname = "friday tag list")
事先回答
SELECT video_id
FROM table
WHERE tag_id = 5
INTERSECT
SELECT video_id
FROM table
WHERE tag_id = 7
或
SELECT video_id
FROM table
WHERE tag_id = 5
AND video_id IN
(
SELECT video_id
FROM table
WHERE tag_id = 7
)
或
SELECT v1.video_id
FROM table v1
JOIN table v2 WHERE v1.video_id = v2.video_id AND v2.tag_id = 7
WHERE tag_id = 5
答案 2 :(得分:0)
可能有更快的方法,但这很简单。我假设有一个主视频video_id的视频表,所以我没有SELECT DISTINCT。
SELECT v.video_id FROM videos as v WHERE
EXISTS (SELECT * FROM tagtable as t WHERE t.video_id = v.video_id and tag_id = 7)
AND EXISTS (SELECT * FROM tagtable as t WHERE t.video_id = v.video_id and tag_id = 5)