gpt4 book ai didi

MYSQL 使用 WHERE 按 ID 列表搜索

转载 作者:行者123 更新时间:2023-11-29 06:51:51 25 4
gpt4 key购买 nike

我有 3 个表:“视频”、“标签”和“链接”。以下是链接表的示例:

mysql> select * from links;
+----+-------+---------+
| id | tagid | videoid |
+----+-------+---------+
| 25 | 6 | 35 |
| 24 | 5 | 7 |
| 23 | 1 | 7 |
| 22 | 7 | 3 |
| 21 | 1 | 3 |
+----+-------+---------+
5 rows in set (0.00 sec)

要获取每个视频的标签列表,我使用以下查询:

SELECT v.id, GROUP_CONCAT(l.tagid) as tags FROM videos v LEFT JOIN links l ON l.videoid = v.id GROUP BY v.id;
+----+------+
| id | tags |
+----+------+
| 30 | NULL |
| 31 | 2 |
| 32 | 1,3 |
| 33 | 1 |
| 34 | 1,2 |
+----+------+
5 rows in set (0.02 sec)

但是我如何搜索包含标签列表的视频?目前我在查询末尾添加 HAVING 子句。

例如,我有三个带有标签“1”、“1,4”、“1,4,7”的视频。为了查找包含标签 1 和 4 的视频,我添加了 HAVING sum(tagid = 1) > 0 AND sum(tagid = 4) > 0。它返回最后两个视频。这是类似问题的解决方案。使用 WHERE 子句对我来说会更方便,因此我正在寻找 WHERE 的答案。

最佳答案

您可以使用 in 子句过滤您需要的标签,并且让 count(disctinct tagid) 等于您需要的标签数量,例如两个名为 tagid1、tagid2 的 tagid

SELECT v.id, GROUP_CONCAT(l.tagid) as tags 
FROM videos v
where l.tagid in( tagid1, tagid2)
LEFT JOIN links l ON l.videoid = v.id GROUP BY v.id
having count(dictinct tagid) = 2;

否则,如果您还需要包含 2 个标签的视频以及其他标签,则应删除having 子句

SELECT v.id, GROUP_CONCAT(l.tagid) as tags 
FROM videos v
where l.tagid in( tagid1, tagid2)
LEFT JOIN links l ON l.videoid = v.id GROUP BY v.id

或者您可以在视频中使用与标签匹配的子句

SELECT v.id, GROUP_CONCAT(l.tagid) as tags 
FROM videos v
where v.id in (
select videos.id
from videos
INNER JOIN links on links.videoid = video.id
and links.tagid in ( tagid1, tagid2)
)
GROUP BY v.id

关于MYSQL 使用 WHERE 按 ID 列表搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47115107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com