[英]How Do I Write This IN Query
I have this table: 我有这张桌子:
video_id tag_id
10 7
6 7
10 5
6 5
9 5
9 4
10 4
I want to write a query which will give me video_id
which have both tag_id
7 and 5. So video_id
10 and 6 should be selected, but not 9. 我想写一个查询,它会给我video_id
,它同时tag_id
7和5.所以应该选择video_id
10和6,而不是9。
I tried where tag_id IN (7, 5)
condition but obviously that includes 9. 我试过where tag_id IN (7, 5)
条件,但显然包括9。
Will it work for you? 它会对你有用吗?
SELECT video_id
FROM table1
WHERE tag_id iN (7,5)
GROUP BY video_id
HAVING COUNT(DISTINCT tag_id) =2;
Update . 更新 。 If you have a unique constraint on (video_id,tag_id), no need for COUNT(DISTINCT)
; 如果您对(video_id,tag_id)有唯一约束,则不需要COUNT(DISTINCT)
; COUNT(*)
will work as well COUNT(*)
也可以
Arbitrary solution - 任意解决方案 -
Below is an answer for sql server, with mysql you would need a count() on video_id and then look for rows with the value needed. 下面是sql server的答案,使用mysql,你需要在video_id上使用count(),然后查找具有所需值的行。
I don't have mysql to test but feel free to add an edit of a correct mysql solution. 我没有测试mysql但可以随意添加正确的mysql解决方案的编辑。
With a table called neededtag with one column (tag) that has the list of what you want 使用一个名为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)
or maybe your needed tag has a criteraname column... then it would look like this: 或者你所需的标签有一个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")
Prior answer 事先答复
SELECT video_id
FROM table
WHERE tag_id = 5
INTERSECT
SELECT video_id
FROM table
WHERE tag_id = 7
or 要么
SELECT video_id
FROM table
WHERE tag_id = 5
AND video_id IN
(
SELECT video_id
FROM table
WHERE tag_id = 7
)
or 要么
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
There may be faster ways to do it, but this is straightforward. 可能有更快的方法,但这很简单。 I'm assuming there's a videos table with primary key video_id, so I don't have to SELECT DISTINCT. 我假设有一个带有主键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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.