gpt4 book ai didi

mysql - 需要更好的 mysql 方法来实现辅助表索引

转载 作者:行者123 更新时间:2023-11-29 21:39:13 26 4
gpt4 key购买 nike

我们目前有两张 table 。一个存储有关服务器的信息,另一个存储该服务器的不同标签。这是一个简化的示例

服务器

服务器 ID

服务器名称

servers_tags

标签ID

服务器 ID

标签

当我们网站上的用户搜索“tag:example tag:example2”时,我们会执行如下查询

SELECT * 
FROM servers AS s
LEFT JOIN servers_tags AS st ON (st.server_id=s.server_id)
WHERE st.tag IN ("example","example2")
GROUP BY s.server_id
HAVING COUNT(DISTINCT st.tag) >= 2

必须有更好的方法来做到这一点,因为在上面的示例中,我提供的是一些具有许多左连接的较大查询的非常简化的版本。当用户搜索

时,该解决方案就会发挥作用。

(st.tag='example' 或 st.tag='example2')和 st.tag='example3'

在这种情况下, count >= 2 并没有真正的帮助。人们在 mysql 中解决这个问题的其他方法是什么?是新的json方法吗?

最佳答案

实际上,查询中不需要 LEFT JOIN,而是需要 INNER JOIN。您不需要没有匹配标签的服务器。

您可以使用 GROUP_CONCAT 来收集以逗号分隔的标签列表(加上最后添加一个逗号)。然后您就可以在列表中搜索该标签。

当服务器拥有全部 3 个标签时 tag_list 为 'example,example1,example2,'

(st.tag='example' 或 st.tag='example2')和 st.tag='example3') 案例的 SELECT

SELECT server_id,
CONCAT(GROUP_CONCAT(st.tag),',') as tag_list
FROM servers AS s
INNER JOIN servers_tags AS st ON (st.server_id=s.server_id)
WHERE st.tag IN ("example","example2","example3")
GROUP BY s.server_id
HAVING COUNT(DISTINCT st.tag) >= 2
AND (INSTR(tag_list, 'example,')>0 OR INSTR(tag_list, 'example1,')>0)
AND INSTR(tag_list, 'example3,')>0

关于mysql - 需要更好的 mysql 方法来实现辅助表索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34672614/

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