需要使用mySql找到所有客户端ID是最有效/最快的方式

时间:2012-08-29 18:33:57

标签: mysql

我有一个看起来像这样的桥接表

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个查询或更快的方式的情况下获得相同的结果,或者是上面的方法是最佳解决方案

4 个答案:

答案 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 = ?