2016-12-11 3 views
0

У меня есть следующий узел таблицы:SQL Filter Records On Список идентификаторов

PersonPhoto

+----+----------+---------+ 
| Id | PersonId | PhotoId | 
+----+----------+---------+ 
| 1 |  10 |  5 | 
| 2 |  11 |  8 | 
| 3 |  12 |  28 | 
| 4 |  10 |  15 | 
| 5 |  10 |  28 | 
| 6 |  12 |  15 | 
+----+----------+---------+ 

Я пытаюсь фильтровать таблицу только возвращать PHOTOID на основе списка PersonId в

Например

Я хотел бы получить все идентификаторы фотографий, в которых есть пользователи 10 и 12, связанные с ними. Используя приведенную выше таблицу, которая должна возвращать следующие фотографии иды

15 и 28 ..

На данный момент мои усилия возвращающимся 15, 28, 5 - Однако я не хочу, 5 должны быть возвращены, потому что Person Id 12 не связан с фотографией ид 5

Вот что я уже пробовал:

select distinct pe.PhotoId 
from PersonPhoto AS pe 
where pe.PersonId IN (10, 12) 
GROUP BY pe.PhotoId 

select pp.PersonId, pp.PhotoId from PersonPhoto AS pp 
where pp.PersonId IN (10, 12) 
GROUP BY pp.PersonId, pp.PhotoId 
HAVING COUNT(DISTINCT pp.PhotoId) = 1 

Есть идеи?

+0

Я удалил несовместимые теги базы данных. Пожалуйста, пометьте базу данных, которую вы действительно используете. –

+0

@Somango Пожалуйста, ознакомьтесь с подробными ответами ниже. –

ответ

2

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

select pp.PhotoId 
from PersonPhoto pp 
where pp.PersonId in (10, 12) 
group by pp.PhotoId 
having count(*) = 2; 

Если вы можете иметь дубликаты в таблицу, то вы должны использовать count(distinct PersonId) в предложении having.

+0

@TimBiegeleisen. , , Когда я прочитал вопрос, это похоже на то, чего хочет OP. , , в основном фотографии, в которых * все * лица, о которых идет речь в них. –

+0

Это похоже на работу, как ожидалось ... Спасибо – somango

+0

@ GordonLinoff Извините, что сомневаюсь в том, что у ОР была формулировка, которая была неясно ИМХО. –

1

Возможно, вы используете оператор INTERSECT, как показано ниже. Хотя это не будет работать в MySQL (Вы SQL Server отмеченном)

(SELECT DISTINCT PhotoId FROM PersonPhoto WHERE PersonId = 10) 
INTERSECT 
(SELECT DISTINCT PhotoId FROM PersonPhoto WHERE PersonId = 12) 

Для MySQL это будет работать, хотя. Идея взята из Mysql intersect results

SELECT DISTINCT PhotoId FROM PersonPhoto 
INNER JOIN (SELECT DISTINCT PhotoId FROM PersonPhoto WHERE PersonId = 10) a USING (PersonId) 
INNER JOIN (SELECT DISTINCT PhotoId FROM PersonPhoto WHERE PersonId = 12) b USING (PersonId) 
+0

Это тоже работало, но я предпочитаю принятый ответ, потому что меньше дублирования. Спасибо за ответ, хотя, я ценю, что вы тратите время на это. – somango

0

Или напишите запрос, используя существующий. Затем он читается точно так же, как вы это заявили.

Select distinct photoId -- get all Photo Ids that  
From @myT a 
Where exists (Select * from @myT -- have the users 10 
       Where photoId = a.photoId 
       and personId = 10) 
    and exists (Select * from @myT -- and 12 associated with them 
       Where photoId = a.photoId 
       and personId = 12) 
+0

это не сработало для меня – somango

+0

Да, у меня были поля в обратном порядке. попробуй это сейчас. –