我有一个看起来像这样的桥接表
clients_user_groups
id = int
client_id = int
group_id = int
我需要查找与client_id 46l属于同一组的所有client_id客户端
我可以实现它,如下所示进行查询,产生正确的结果
SELECT client_id FROM clients_user_groups WHERE group_id = (SELECT group_id FROM clients_user_groups WHERE client_id = 46);
基本上我需要知道的是,如果有一种方法可以在不使用2个查询或更快的方式的情况下获得相同的结果,或者是上面的方法是最佳解决方案
答案 0 :(得分:0)
您正在使用WHERE
- 子句子查询,在MySQL中,最终会对表中的每一行重新评估。改为使用JOIN
:
SELECT a.client_id
FROM clients_user_groups a
JOIN clients_user_groups b ON b.client_id = 46
AND a.group_id = b.group_id
由于您计划在将来为多个群组提供便利,因此您可能需要将DISTINCT
添加到SELECT
,以便不会返回同一client_ids
的多个(client_id, group_id)
当你切换时(由于客户端在多个client_id 46的组中)。
如果您尚未这样做,请在以下位置创建以下复合索引:
client_id
EXPLAIN
位于索引的第一个位置,因为它最有可能提供最佳的初始选择性。此外,如果表中有大量行,请确保索引与{{1}}一起使用。
答案 1 :(得分:0)
你也可以尝试自我加入
SELECT a.client_id
FROM clients_user_groups a
LEFT JOIN clients_user_groups b on b.client_id=46
Where b.group_id=a.group_id
答案 2 :(得分:0)
set @groupID = (SELECT group_id FROM clients_user_groups WHERE client_id = 46);
SELECT client_id FROM clients_user_groups WHERE group_id = @groupID;
您将获得一个获取组ID的查询,并将其存储到变量中。在此之后,选择client_id值,其中group_id与存储在变量中的值匹配。如果为clients_user_groups.group_id定义索引,则可以进一步加快此查询。
注1:我没有测试我的代码,希望没有错别字,但你有我想的想法。
注意2:这应该在一个请求中完成,因为如果我们查看所需的时间,数据库请求非常昂贵。
答案 3 :(得分:0)
根据您的评论,每个客户端只能属于一个组,我建议更改架构,将group_id关系作为字段放入客户端表中。通常,可以使用您所描述的JOIN表来表达关系数据库中的多对多关系(即客户端可以属于许多组,组可以有许多客户端)。
在这种情况下,查询将不需要像这样的子选择:
SELECT c.client_id
FROM clients as c
INNER JOIN clients as c2 ON c.group_id = c2.group_id
WHERE c2.client_id = ?