2013-08-02 4 views
0

У меня есть четыре стола, фото, событие, новости, пятно и фотография - это таблица, в которой я хочу проверить записи с отношениями к другим таблицам.Фильтрация одной таблицы с несколькими внутренними соединениями с другими таблицами

фотография имеет следующий sructure:

кроме фото
id 
rel_model -> one of "news", "spot" and "event" 
rel_id -> id of the related record in rel_model table 
... 

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

Я попробовал следующее

select 
    count(*) 
from 
    Photo 
     inner join Event ON (rel_id = Event.id and rel_model="event") 
     inner join News ON (rel_id = News.id and rel_model="news") 
     inner join Spot ON (rel_id = Spot.id and rel_model="spot"); 

но я получаю 0 результаты, где пытаются это лишь один внутреннее объединение работ для проверки против одной таблицы

select 
    count(*) 
from 
    Photo 
     inner join Event ON (rel_id = Event.id and rel_model="event") ; 

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

Как я могу получить фотографии, которые по-прежнему имеют неразрывные отношения с другими таблицами?

ответ

2

вы могли бы использовать этот запрос

select 
    count(*) 
from Photo as P 
where 
    P.rel_model = "event" and P.rel_id in (select T.id from Event as T) or 
    P.rel_model = "news" and P.rel_id in (select T.id from News as T) or 
    P.rel_model = "spot" and P.rel_id in (select T.id from Spot as T) 

Если вы хотите изменить свой запрос, вы должны использовать left outer join:

select 
    count(*) 
from Photo as P 
    left outer join Event ON (rel_id = Event.id and rel_model="event") 
    left outer join News ON (rel_id = News.id and rel_model="news") 
    left outer join Spot ON (rel_id = Spot.id and rel_model="spot") 
where News.id is not null or Spot.id is not null or Event.id is not null 

Ваш возвращаемые запрос нулевых строк, потому что вы пытаетесь присоединиться к той же строке со всеми три таблицы, но вы присоединяетесь к условию, соответствует только одному, поэтому другие два внутренних объединения исключают вас.

1

Вы можете сделать это с помощью внешних соединений. С внутренними объединениями вы теряете строку, когда rel_id не соответствует ни одному из трех (и, по-видимому, он соответствует только одному из них, поэтому вы теряете все строки). Затем вам необходимо подсчитать каждый отдельно:

select count(Event.id) + count(News.id) + count(Spot.id) 
from Photo p left join 
    Event 
    ON p.rel_id = Event.id and rel_model="event" left join 
    News 
    ON p.rel_id = News.id and rel_model="news" left join 
    Spot 
    ON p.rel_id = Spot.id and rel_model="spot"; 
Смежные вопросы