2015-08-06 4 views
2

У меня есть две таблицы:MySQL - выбор группы, имеющие значения, охватывающих множество

CREATE TABLE user (
    user_id INT PRIMARY KEY, 
    ... 
); 
CREATE TABLE action (
    action_id INT PRIMARY KEY, 
    user_id INT FOREIGN KEY REFERENCES user(user_id), 
    action_type TINYINT, 
    ... 
); 

Каждый раз, когда пользователь выполняет определенное действие, строка вставляется в action таблице.

Теперь я хочу найти всех пользователей, выполнивших весь набор действий. Что-то вроде этого:

SELECT user_id 
FROM user, action 
HAVING SET(action_type) INTERSECT (0,3,4,5) = (0,3,4,5); 

Но, конечно, я только что составил эту последнюю строку. Есть ли хороший способ сделать это в SQL?

ответ

3

Это пример запроса набора-внутри-множествах , Мне нравится их решать с использованием group by и having, потому что это очень гибкий:

SELECT user_id 
FROM action a 
WHERE action_type IN (0, 3, 4, 5) 
GROUP BY user_id 
HAVING COUNT(DISTINCT action_type) = 4; 
1

4 в `, имеющий п есть число действий, которые вы имеете в своем наборе

SELECT u.user_id 
FROM user u 
JOIN action a on u.user_id = a.user_id 
WHERE action_type IN (0,3,4,5) 
GROUP BY u.user_id 
HAVING count(distinct a.action_type) = 4 

Другим способом

SELECT u.user_id 
FROM user u 
JOIN action a on u.user_id = a.user_id 
GROUP BY u.user_id 
HAVING sum(a.action_type = 0) > 0 
AND sum(a.action_type = 3) > 0 
AND sum(a.action_type = 4) > 0 
AND sum(a.action_type = 5) > 0