2014-01-07 3 views
1

У меня есть groups, users и users_groups таблица. Отношения между пользователями и группами очень многим. Пользователи могут быть выделены нескольким группам. Я хотел бы запустить запрос, который получает список групп, которые являются COMMON между user_id1 и user_id2.Поиск общих строк с SQL

Я построил следующий запрос, но он, кажется, разбивает систему и сервер mysql (на xampp), и страница навсегда загружается (т. Е. Не загружается).

Почему это? В таблице пользователей около 6000 тестовых пользователей, 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); 

ответ

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 
+0

Спасибо. Мне пришлось изменить ug_group_id в обеих строках 4 и 5 на ug_user_id, и после этого он работал. Еще раз спасибо! – emkay

+0

@emkay Приветствую вас ... –

Смежные вопросы