Определение того, что входит в отношение «многие ко многим»

Это, вероятно, простой ответ, но я работал над этой проблемой последние пару дней, и это начинает сводить меня с ума.

У меня есть база данных с отношениями многие ко многим


-------------     ---------------------     ------------------- 
|Images     |     |user2img           |     |User             | 
-------------     ---------------------     ------------------- 
|imgID      |     |id                 |     |UserID           |
|imgURL     |     |imgID              |     |UserName         |
|imgAv      |     |UserID             |     |UserEmail        |
-------------     ---------------------     ------------------- 

Таблица user2img указывает, какое изображение разрешено просматривать пользователю.

Я пытаюсь определить SQL-запрос, который будет отображать каждое изображение (один раз без повторения) и сообщать мне, имеет ли указанный пользователь права на просмотр этого изображения или нет.

Таким образом, вывод, как

(ГДЕ UserID = '1')

----------------------------
|imgID   | imgURL | access |
----------------------------
|1       | xxx    |  Yes   |
|2       | yyy    |  No    |
|3       | qqq    |  Yes   |
|4       | rrr    |  Yes   |
|5       | www    |  No    |
|6       | sss    |  Yes   |
 etc...
----------------------------

Спасибо,


person C.d. Rudd    schedule 28.10.2013    source источник


Ответы (1)


Одной из возможностей было бы (я допускаю, что это не лучший и, вероятно, не очень эффективный) выбрать все совпадающие изображения для пользователя с внутренним соединением по таблице составных ключей и UNION результат с отрицательным выбором (iid равен imageId в моей тестовой таблице):

select 
    iid, url, 'yes'
    from user_has_image
    inner join image on user_has_image.iid = image.id
    inner join user on user_has_image.uid = user.id
    where user.id = 1
union
select 
    iid, url, 'no'
    from user_has_image
    inner join image on user_has_image.iid = image.id
    inner join user on user_has_image.uid = user.id
    where user.id <> 1

Вы можете увидеть результат в этом сеансе SQLFiddle.

person keenthinker    schedule 28.10.2013
comment
Разве это также не даст мне вывод, в котором есть все пользователи, у которых нет идентификатора 1 (пользователь 2, 3, 4, 5, 6, 7, 8... и т. д.), а также пропущенные изображения, которые пользователь не указан в таблице user2img? - person C.d. Rudd; 29.10.2013
comment
Да, но в вашем примере из вопроса - не будет ли это так для всех пользователей, если в таблице user2image нет сопоставления? Если UserId НЕ присутствует в таблице, то у пользователя нет доступа к этому изображению. Другого решения проблемы отрицания нет. Вы можете переписать UNION на левое или правое соединение, но это будет то же самое - каждый результат, который является нулевым для UserId, будет изображением для всех других пользователей в таблице user2image. . Я думаю, вам нужно проверить только доступ - если присутствует соединение с использованием внутреннего соединения. - person keenthinker; 29.10.2013