Вопрос

У меня есть две связанные таблицы. Одним из таблиц содержит каждую запись для фотографий, а другой имеет все записи CAT для каждой фотографии и информации о пользователе.

photos table:
id
photo (unique filename)
user


cats tables

photo
user
cat
.

Фотографии

1    photo1.jpg    40000
2    photo2.jpg    40000
3    photo3.jpg    40000
4    photo4.jpg    40001
5    photo5.jpg    40001
.

Кошки

photo1.jpg    40000    A
photo2.jpg    40000    A
photo1.jpg    40000    B
photo1.jpg    40000    C
photo2.jpg    40000    P
photo3.jpg    40000    A
.

Каждое фото можно назначить более крупным категориям для каждого пользователя

Что я хочу, это выбрать все фотографии для пользователя 40000, которые не были включены в «P», даже если они, возможно, были включены в «A» или «B» Cat.

Потому что photo2.jpg включен в P Cate не должен появляться в результатах поиска. Мой запрос для пользователя 40000 должен дать результаты результатов:

photo1
photo3
.

Это было полезно?

Решение

должен быть простым левым присоединением / нулевым тестом

select
      p.id,
      p.photo
   from
      photos p
         left join cats c
            on p.photo = c.photo
            AND c.cat = 'P'
   where
          p.user = 40000
      and c.photo is null
.

В основном левое соединение все еще позволяет всем фотографиям быть квалифицированным.Однако, если присоединение специально существует в таблице категорий на одной и той же фотографии и категории= «P», то она будет иметь значение для «C.Photo».Таким образом, в том случае, в том случае, если я добавил только те, которые не существуют (через NULL), существуют в таблице Cat.

Другие советы

mysql> select * from photos 
       where photo not in (select photo from cats where cat='P') 
       and user = '40000';
.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top