2015-07-04 4 views
0

Я пытаюсь выяснить, как я могу выполнить запрос к моей таблице, чтобы узнать, соответствует ли группа user_id match_id.MySQL проверяет, соответствуют ли значения, разделенные запятой, строками в таблице

Запрос 1 должен возвращать результат для: user_id 1 смотрит, чтобы увидеть, если есть какие-либо conversation_id с только user_id = 2 и user_id = 1 в нем. (Если возвращать строку для каждого conversation_id = 1, 2, 4, 5 на основе SQL Скрипки, например)

conversation_id 
1 
2 
4 
5 

Запрос 2 должен возвращать результат для: user_id 1 смотрит, чтобы увидеть, если есть какие-либо conversation_id-х с user_id = 2, user_id = 1, и user_id = 4. (Возвращает 0 строк, не существует в примере SQL Скрипки)

Настройка таблицы находится в SQL Fiddle

+0

Вопрос упоминает разделенные запятой значения, но остальная часть вопроса не делает. Где значения, разделенные запятой, попадают в картину? – jpw

+0

Я имею в виду так, как вы написали эту часть ", а user_id не в (1,2)". Посмотрите на свой ответ и протестируйте его сейчас. Спасибо – Wes

ответ

1

Вы можете использовать комбинацию group by ... having и коррелировать exists подзапрос для достижения желаемого результата хочу:

-- Query 1: 

SELECT 
    conversation_id 
FROM 
    users_conversations uc 
where not exists (
    select 1 from users_conversations 
    where conversation_id = uc.conversation_id 
    and user_id not in (1,2) 
) 
group by conversation_id 
having count(distinct user_id) = 2; 

-- Query 2: same query, only different numbers. 

SELECT 
    conversation_id 
FROM 
    users_conversations uc 
where not exists (
    select 1 from users_conversations 
    where conversation_id = uc.conversation_id 
    and user_id not in (1,2,4)) 
group by conversation_id 
having count(distinct user_id) = 3; 

Sample SQL Fiddle

Обратите внимание, что первый запрос не возвратит 1,2,4,5 а 2,5, но в ваших данных выборки ни 1, ни 4 не имеют только user_id 1 и 2 в качестве участников (conversation 1 имеет 1,2,3,4, а conversation 4 имеет 1,2,5).

+1

Это сработало спасибо! – Wes

1

Если я правильно понимаю, это должно быть что-то вроде его.

1:

SELECT 
CASE 
WHEN 
count(distinct CASE WHEN user_id in ('1','2') THEN user_id END)>='2' 
THEN `conversation_id` 
END 'test' 
FROM 
users_conversations 
where 1 
group by `conversation_id` 

Q2:

SELECT 
CASE 
WHEN 
count(distinct CASE WHEN user_id in ('1','2','4') THEN user_id END)>='3' 
THEN `conversation_id` 
END 'test' 
FROM 
users_conversations 
where 1 
group by `conversation_id` 
Название

http://sqlfiddle.com/#!9/fb29d/9