Подскажите SQL-запрос для выборки пользователей по их опциям

Имеются пользователи и их опции (например, живет в Москве или Питере, для выхода в сеть пользуется мобильным, планшетом или ноутбуком..., возраст молодой, средний или старший и т.д.).

Таким образом, у каждого пользователя несколько опций



Теперь я делаю выборку по опциям и нужно вернуть соответствующих пользователей. Например, я выбираю, чтобы человек жил в Москве и имел планшет. Есть таблица связей — пользователь-опция.



Как построить SQL-запрос, чтобы решить задачу?
  • Вопрос задан
  • 4354 просмотра
Решения вопроса 1
@PomanoB
Может так:
SELECT userid FROM user_options WHERE optionid IN (2, 3) GROUP BY userid HAVING COUNT(*) = 2


Или так:
SELECT o1.userid FROM user_options o1
INNER JOIN user_options o2 ON o1.userid = o2.userid AND o2.optionid = 3
WHERE o1.optionid = 2
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
devaka
@devaka Автор вопроса
технарь
Пока приходит в голову сделать алиасы

SELECT 
    a.userid
FROM 
    user_options a, 
    user_options b
WHERE a.userid = b.userid
    AND a.optionid=2
    AND b.optionid=3
GROUP BY a.userid

Однако, решение не гибкое. Если при поиске я выберу 10 опций, запрос будет достаточно долго выполняться при росте размеров таблиц. Может есть более гибкое решение?
Ответ написан
Комментировать
FloppyFormator
@FloppyFormator
А чтобы тут не было слишком скучно, предложу ещё одно решение для MySQL:

SELECT user_id FROM user_option GROUP BY user_id HAVING GROUP_CONCAT(DISTINCT option_id ORDER BY user_id ASC SEPARATOR ',') = '1,2,3,4,5';
Ответ написан
@gleb_kudr
SELECT user FROM table WHERE option=someOption INTERSECT SELECT user FROM table WHERE option2=someOption2 INTERSECT etc…
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы