2014-01-10 56 views
2

我有一个groups,usersusers_groups表。用户和组之间的关系是多方面的。用户可以分配到多个组。我想运行一个查询,获取具有至少一个公共组的特定用户ID的用户列表。更高效的SQL查询构造

  1. 如何重构此查询以使其更快?我认为这可能与使用GROUP BY有关?

  2. 我该如何实现排序,使拥有更多通用组的用户先出现?

    $user_id = $this->db->escape($user_id); 
    $sql = "SELECT DISTINCT(ug_user_id) 
          FROM users_groups 
          INNER JOIN groups ON groups.group_id = users_groups.ug_group_id 
          WHERE ug_group_id IN (
           SELECT ug_group_id 
            FROM users_groups 
            WHERE ug_user_id = $user_id) 
          LIMIT 50"; 
    $query = $this->db->query($sql); 
    

回答

2

加入表本身:

SELECT DISTINCT (g2.ug_user_id) 
    FROM 
     users_groups as g1 
     JOIN 
     users_groups as g2 
     ON g1.ug_group_id = g2.ug_group_id 
      and g1.ug_user_id != g2.ug_user_id 
    WHERE g1.ug_user_id = $user_id; 
+0

嗨,感谢您的回答,但由于WHERE子句将结果限制为该特定用户标识,因此不起作用。我想要一个与该用户标识具有共同组的用户列表;) – emkay

+0

完成了,我认为这可以工作。 – Melon

+0

谢谢,会做一些测试,并让你知道:) – emkay

1

您也可以使用下面的查询来获取由普通组的数量排序的列表:

SELECT ug_user_id, 
     COUNT(*) AS COMMONCOUNT 
     FROM users_groups 
     WHERE ug_group_id IN (
        SELECT ug_group_id 
        FROM users_groups 
        WHERE ug_user_id = $user_id) 
      AND ug_user_id <> $user_id 
GROUP BY ug_user_id  
ORDER BY COMMONCOUNT DESC