2010-04-04 2 views
1

У меня есть дома, принадлежащие улицам. Пользователь может купить несколько домов. Как узнать, владеет ли пользователь всей улицей?sql query question/count

street table with columns (id/name) 
house table with columns (id/street_id [foreign key] 
owner table with columns (id/house_id/user_id) [join table with foreign keys] 

До сих пор я использую счетчик, который возвращает результат:

select count(*), street_id from owner left join house on owner.house_id = house.id group by street_id where user_id = 1 
count(*) | street_id 
3  | 1 
2  | 2 

Более общий подсчет:

select count(*) from house group by street_id returns: 
count(*) | street_id 
3  | 1 
3  | 2 

Как я могу узнать, что пользователь 1 владеет целая улица 1, но не улица 2?

Спасибо.

+0

Борясь, чтобы понять ваш вопрос, просьба рассмотреть вопрос о внесении последнего вопроса. – Nix

ответ

1

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

select count(*), street_id from owner left join house on owner.house_id = house.id group by street_id where user_id != 1 
0

Этот запрос содержит список всех пользователей, которые владеют целую улицу, и на улице, что они владеют:

SELECT DISTINCT o.user_id, h.street_id, s.name FROM owner o 
INNER JOIN house h ON h.id = o.house_id 
INNER JOIN street s ON s.id = h.street_id 
LEFT OUTER JOIN house h2 ON h2.street_id = h.street_id AND h2.id <> h.id 
INNER JOIN owner o2 ON o2.house_id = h2.id AND o2.user_id <> o.user_id 
WHERE o2.user_id IS NULL 

В этом случае, «владеет целую улицу», означает, что никакой другой владелец не владеет дом на той же улице. Это также предполагает, что у вас есть данные для каждого дома и владельца на улице.

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