gpt4 book ai didi

mysql - Rails + MySQL,多对多关系的交集

转载 作者:行者123 更新时间:2023-11-29 03:21:34 24 4
gpt4 key购买 nike

我在多对多关系中有站点和标签,通过连接表 SitesTags 连接:

Site
has_and_belogs_to_many :tags
id name
1 siteA
2 siteB

Tag
# has_and_belogs_to_many :sites
id name
1 tagA
2 tagB
3 tagC

SitesTags
site_id tag_id
1 1
1 2
2 2
2 3

我想获得两个站点共有的标签的 COUNT 个。在这个例子中,siteA 和 siteB (tagB) 有一个公共(public)标签。

理想情况下,我想要数据库级别的解决方案,但我使用的是 MySQL。我试过 (Site.find(1).tags & Site.find(2).tags).count但我可以看到这是在执行多个查询,它没有使用 COUNT(*) 而是获取所有数据:

Site Load (0.3ms)  SELECT  `sites`.* FROM `sites` WHERE `sites`.`id` = 1 LIMIT 1
Site Load (0.3ms) SELECT `sites`.* FROM `sites` WHERE `sites`.`id` = 2 LIMIT 1
Tag Load (0.3ms) SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 1
Tag Load (0.4ms) SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 2

我试过的另一件事是

Site.find(1).tags.where("`sites_tags`.`site_id` = 2")

正在发电

SELECT `tags`.* FROM `tags` INNER JOIN `sites_tags` ON `tags`.`id` = `sites_tags`.`tag_id` WHERE `sites_tags`.`site_id` = 1 AND (`sites_tags`.`site_id` = 2)

这行不通,我认为它正在尝试查找 site_id 为 1 和 2 的单个记录

最佳答案

要计数,试试这个:

Site.find(1).tags.count

要获取 site1site2 中常见的标签计数:

s1 = Site.find(1).tags.map(&:name)

s2 = Site.find(2).tags.map(&:name)

common_tags s1 & s2

关于mysql - Rails + MySQL,多对多关系的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43693493/

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