0

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

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

4 回答 4

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
于 2012-08-29T18:52:20.197 回答
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 的查询并将其存储到变量中。在此之后,您选择 group_id 与存储在变量中的值匹配的 client_id 值。如果为clients_user_groups.group_id 定义索引,则可以进一步加快查询速度。

注意1:我没有测试我的代码,希望没有错别字,但你已经明白了我的想法。

注意2:这应该在单个请求中完成,因为如果我们查看所需的时间,DB 请求非常昂贵。

于 2012-08-29T18:54:47.407 回答
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 = ? 
于 2012-08-29T19:01:02.977 回答
0

您正在使用WHERE-clause 子查询,在 MySQL 中,最终会为表中的每一行重新评估。使用 aJOIN代替:

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

由于您计划将来为拥有多个组的客户提供便利,因此您可能需要添加DISTINCTSELECT以便client_ids在您切换时不会返回多个相同的组(因为客户端位于多个 client_id 46 组)。

如果您还没有这样做,请在以下位置创建以下复合索引:

(client_id, group_id)

client_id索引中的第一个位置,因为它很可能提供最佳的初始选择性。此外,如果您的表中有大量行,请确保索引与EXPLAIN.

于 2012-08-29T18:38:44.267 回答