gpt4 book ai didi

MYSQL如何确保存在多个关联

转载 作者:行者123 更新时间:2023-11-29 00:47:57 27 4
gpt4 key购买 nike

所以,我想要一个 SQL 查询,我可以在其中执行具有多个关联的对象所以我想查询所有包含我限制的所有标签的视频

所以视频必须有一个 videos_tags 将其关联到 tags.id 1,2 和 3

到目前为止我已经尝试过了

SELECT videos.*, tags_videos.tag_id, tags_videos.video_id FROM videos
LEFT JOIN tags_videos ON tags_videos.video_id = videos.id
WHERE tags_videos.tag_id IN (1,2,3)

但这似乎更像是一个 OR 子句,而不是一个 AND 子句,还有 Exclusive 和 IN 语句?

这也是在具有事件记录的 Rails 中。有没有办法通过 Rails 中的 AR 轻松做到这一点?

这是我尝试过的

Video.all.select{|v|参数[:tags].select{|t| v.tag_ids.include?(t.to_i)}.count == params[:tags].count

最佳答案

如果您想要具有标签 1、2 和 3 的视频,请设想结果行需要是什么样子。您会发现每个标签都需要一列。为此,您需要针对要匹配的每个标签针对 tags_videos 加入一次。

SELECT videos.* FROM videos
INNER JOIN tags_videos t1 ON (t1.video_id = videos.id AND t1.tag_id=1)
INNER JOIN tags_videos t2 ON (t2.video_id = videos.id AND t2.tag_id=2)
INNER JOIN tags_videos t3 ON (t3.video_id = videos.id AND t3.tag_id=3)

我还使用了 INNER JOIN 而不是 LEFT JOIN,因为您对任何不匹配的都不感兴趣。

从概念上讲,您可以将此查询视为首先获取所有具有标签 1 的视频,然后查看其中哪些视频也具有标签 2。所以现在我们有了标签 1+2 的视频,我们可以查看哪些 那些也有tag3。您可以根据需要继续使用任意数量的标签。

虽然我怀疑它是否适用于您的情况,但另一种方法是使用 SET列类型来存储视频的所有标签,但这只允许 64 个不同的标签。优点是该列可以存储在视频表中,因此不需要连接(您只需要多次使用 FIND_IN_SET 的 WHERE 子句)

关于MYSQL如何确保存在多个关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783047/

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