gpt4 book ai didi

mysql - 查询难度更大的多对多关系

转载 作者:行者123 更新时间:2023-11-29 00:02:41 24 4
gpt4 key购买 nike

这是我的问题:我有两个表通过连接表连接。我在 Apache 服务器上使用 MySQL 和 PHP (Yii2),但这只是我需要帮助的 SQL。

| Objects     |    ObjectHasTag    |   Tag    |
|---------------------------------------------|
| - id | -object_id | -id |
| - name | -tag_id | -tag |

我需要创建一个查询来返回标记有多个标签的对象,我的问题是这是否可以作为查询的可公开访问的功能以合理的效率实现。

示例:查找带有标签“tagone”、“tagtwo”和“tagthree”的所有对象。

我有一个可行的解决方案,那就是在对象表中有一个“标签”列,所有标签名称都用逗号分隔。这看起来不像是“最佳实践”——有点像解决方案。

非常感谢你们提供的任何帮助!

最佳答案

此 SQL 相对简单:

SELECT *
FROM Objects o
WHERE 3 = (
SELECT COUNT(DISTINCT t.id)
FROM ObjectHasTag ot
JOIN Tag t ON t.id=ot.tag_id
WHERE o.id = ot.object_id
AND t.tag IN ('tag1', 'tag2', 'tag3')
)

COUNT(DISTINCT t.id)ObjectHasTag加入Tag,过滤列表中的Tag你想搜索,并计算不同标签的数量。为了选择对象,IN 列表中的所有三个项目都必须存在。如果您知道 ObjectHasTag 不能包含重复标记,例如,因为您有一个唯一索引或对表的约束,您可以替换 COUNT(DISTINCT t.id)使用 COUNT(*)

o.id = ot.object_id 条件将嵌套查询“连接”到从 Objects 表中选择的对象。

关于mysql - 查询难度更大的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016169/

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