我有一个groups
,users
和users_groups
表。用户和组之间的关系是多对多的。用户可以分配到多个组。我想运行一个查询,该查询获取user_id1和user_id2之间 COMMON 的组列表。
我构造了以下查询,但它似乎崩溃了系统和mysql服务器(在xampp上),并且页面需要永远加载(即不加载)。
这是为什么? users表中有大约6000个测试用户,groups表中有30个组,70,000个users_groups条目。有没有更好的方法来构建此查询?
$user_id1 = $this->db->escape($user_id1);
$user_id2 = $this->db->escape($user_id2);
$sql = "SELECT $select_string 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_id2)
AND ug_user_id = $user_id1 LIMIT 10";
$query = $this->db->query($sql);
答案 0 :(得分:2)
使用 GROUP BY ... HAVING
试试这个:
SELECT $select_string
FROM users_groups ug
INNER JOIN groups g ON g.group_id = ug.ug_group_id
WHERE ug.ug_user_id IN ($user_id1, $user_id2)
GROUP BY g.group_id HAVING COUNT(DISTINCT ug.ug_user_id) = 2
LIMIT 10