Никак не могу составить правильно запрос.
Задача такова:
есть объекты, кот. содержат коллекцию других объектов (например сообщение и список пользователей, кот. его прочитали)
Нужно подсчитать количество объектов, в коллекции кот. нет конктетного пользователя (количество непрочитанных сообщений).
Подскажите правильный путь.
Заранее благодарен.
Здравствуйте, lexius, Вы писали:
L>есть объекты, кот. содержат коллекцию других объектов (например сообщение и список пользователей, кот. его прочитали) L>Нужно подсчитать количество объектов, в коллекции кот. нет конктетного пользователя (количество непрочитанных сообщений).
select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)
За абсолютную точность не ручаюсь, но как-то так.
Re[2]: Hibernate и сложный запрос
От:
Аноним
Дата:
06.04.08 10:27
Оценка:
Здравствуйте, Аноним, Вы писали:
А>select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)
А>За абсолютную точность не ручаюсь, но как-то так.
Тут я ступил, конечно. Связь же будет many-to-many через вспомогательную таблицу. Однако можифицировать запрос не составит труда, так что оставляю развитие вопроса автору топика.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>select count(*) from Comment c1 where c1.id not in (select c2.id from Comment c2 inner join c2.user)
А>>За абсолютную точность не ручаюсь, но как-то так.
А>Тут я ступил, конечно. Связь же будет many-to-many через вспомогательную таблицу. Однако можифицировать запрос не составит труда, так что оставляю развитие вопроса автору топика.
Работает, спасибо.
Возник еще один вопрос, хотя это немного выходит за рамки темы — как вложенный select повлияет на производительность при большом числе строк в таблице?
Здравствуйте, lexius, Вы писали:
L>Работает, спасибо. L>Возник еще один вопрос, хотя это немного выходит за рамки темы — как вложенный select повлияет на производительность при большом числе строк в таблице?
А тут только explain подскажет. Но вообще не очень чтобы хорошо. Это был пример навскидку, а если немного подумать, то запрос можно вывернуть и без подзапросов.
Структура — Comment, UserComment (связь между User и Comment)
select count(*) from Comment c left outer join c.userComment uc where uc.id is null group by c.id
Здравствуйте, .rt, Вы писали:
.rt>Здравствуйте, Аноним, Вы писали:
А>>Структура — Comment, UserComment (связь между User и Comment)
.rt>Прошу прощения, поправлюсь, хоть это и не имеет значения: .rt>структура Comment, UserComment, User.
.rt>p.s. решил зарегистрироваться всё-таки.
Немного покрутив, в оригинале запрос теперь выглядит так:
select count(b.id) from Bid as b left join b.project as bp where bp.user.id = :puserId and bp.user not in elements(b.readedUsers)
hibernate генерирует следующий sql:
select
count(bid0_.id) as col_0_0_
from
bids bid0_
left outer join
projects project1_
on bid0_.project_id=project1_.id
where
project1_.owner_id=?
and (
project1_.owner_id not in (
select
readeduser2_.user_id
from
bids_readed_users readeduser2_
where
bid0_.id=readeduser2_.bid_id
)
)
Как переписать без вложенного select я пока затрудняюсь. По крайней мере сходу правильно сделать не получилось.