2015-05-25 8 views
1

Дайте таблице ниже:MySQL: Query подмножество строк

ТАБЛИЦА: USER_ASSETS

USER_ID | ASSET_ID 
------------------- 
1  | 1 
------------------- 
1  | 2 
------------------- 
1  | 3 
------------------- 
2  | 2 
------------------- 
2  | 3 
------------------- 

Если я искать USER_ID с ASSET_ID равен 1 и 2, он должен вернуть USER_ID 1 как USER_ID 1 имеет ASSET_ID 's 1 и 2.

Если я прохожу ASSET_ID = 1, 2 и 4, она должна возвращать 0 строк, нет USER_ID' s, которые имеют ASSET_ID 1, 2 и 4.

Если я прохожу ASSET_ID 2 и 3 она должна возвращать USER_ID 1 и 2, как оба этих USER_ID «s имеет ASSET_ID 2 и 3.

прямо сейчас я застрял, как я не удалось найти правильный запрос для моего желаемого результата.

Я попытался это:

SELECT DISTINCT ID FROM USER_ASSETS WHERE ASSET_ID IN (1, 2); 

Но результат не так, как она возвращается как USER_ID 1 и 2.

Я также попытался:

SELECT DISTINCT ID FROM USER_ASSETS WHERE ASSET_ID = 1 AND ASSET_ID = 2 

Но это всегда возвращение до 0 строк, поскольку предложение WHERE выполняется в одну строку за раз.

+0

спасибо за редактирование @Dijkgraaf, я имею в виду использовать соединение той же таблице для каждого значения ASSET_ID, но это правильный подход? – s4m0k

+0

Нет, это не так (ну, это решение, но это неудобно сложное). см. ответ ниже. –

+0

См. Ответ Мизандриста, где он делает именно это, но он становится очень громоздким очень быстро. Ответ Палы также может работать.Попробуйте их – Dijkgraaf

ответ

2

Вы могли бы попробовать что-то вроде этого:

select user_id 
    from user_assets 
    where asset_id = 1 or asset_id = 2 ... 
    group by user_id 
    having count(distinct asset_id) = (number of assets you are looking for) 

demo here показывая ваш нужный выход.

внятного не требуется, если (user_id, asset_id) является уникальным ключом

+0

Спасибо, это возвращает точно строки, которые я хотел. – s4m0k

1

WHERE ASSET_ID IN (1, 2) такое же, как WHERE ASSET_ID = 1 OR ASSET_ID = 2, и оба USER_ID 1 и 2 имеют USER_ID записи с ASSET_ID = 2, так что этот раздел WHERE будет включать в себя обе эти строки.

WHERE ASSET_ID = 1 AND ASSET_ID = 2 потерпит неудачу, потому что нет ни одной строки, которая имеет как 1, так и 2 для ASSET_ID.

Я думаю, что вы спрашиваете, как получить USER_ID, который имеет весь набор ASSET_ID s. В этом случае вам необходимо построить более сложный запрос:

SELECT A1.USER_ID 
FROM USER_ASSETS AS A1 
INNER JOIN USER_ASSETS AS A2 
ON A1.USER_ID = A2.USER_ID 
WHERE A1.ASSET_ID = 1 AND A2.ASSET_ID = 2 

Это будет возвращать все USER_ID значения, которые имеют как ASSET_ID 1 и ASSET_ID 2. Вы можете добавить столько INNER JOIN статей и дополнительные условия An.ASSET_ID к WHERE как вам нужно.

+0

Да, точно, не могли бы вы рассказать мне правильный подход? Спасибо – s4m0k

+0

Спасибо за ответ, этот JOIN - это то, о чем я думал, но строки ASSET_ID могут быть более 10, а это означает соединение для таблицы 10x, которое повлияет на производительность. – s4m0k

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