У меня есть таблица БД с именем book.Столбцы: id, автор, заголовок, isbn, collection_name, collection_id, volume_number, owner_id, can_be_borrowed.И таблица владельца содержит столбцы: имя, идентификатор, адрес, наблюдения.
owner_id - это внешний ключ, который сопоставляется с идентификатором в таблице владельца.
Может появиться коллекциямного раз в книжном столе.Например, может быть 5 копий коллекции Гарри Поттера.Две из этих коллекций могут иметь can_be_borrowed = true , в то время как три другие могут иметь can_be_borrowed = false .Кроме того, collection_id уникален для каждого экземпляра коллекции.Это означает, что каждая коллекция Гарри Поттера будет иметь разные collection_id.Но все они будут иметь одно и то же имя_коллекции.
Итак, учитывая идентификатор владельца, я хочу найти все коллекции, принадлежащие этому владельцу.Ограничения:
- Для любой коллекции должен быть возвращен только том 1
- Даже если коллекция многократно появляется в БД (например, Гарри Поттер), только одно вхождение томаДолжно быть возвращено 1
- Если коллекция многократно появляется в БД, result.can_be_borrowed должен иметь значение true, если один том во всех экземплярах коллекций имеет значение true.Например, если верным является только том 3 из коллекции 4 в наборе коллекций «Гарри Поттер», то результат должен означать, что can_be_borrowed должен быть истинным.Неважно, какое значение имеют все тома.
- Каждая строка результатов должна содержать адрес владельца
Теперь, пожалуйста, потерпите меня.Мой SQL ржавый.Вот что я получил софар:
select o.address, o.id, b.*,
bool_or(can_be_borrowed)
from owner o, book b
where b.collection_name in (select collection_name
from owner o2, b2
where o2.id=${owner_id}
and o2.id=b2.id)
and volume=1
group by b.collection_name
Подзапрос находит все collection_name, которые принадлежат указанному владельцу.Внешний запрос ищет весь том 1 в найденном наборе collection_names.И затем, чтобы убедиться, что мы получаем только один элемент на коллекцию, мы группируем по collection_name.Наконец, чтобы убедиться, что мы знаем, можно ли заимствовать коллекцию, мы агрегируем по can_be_borrowed.
Теперь у этого запроса есть проблема: я не могу просто сгруппировать по collection_name.По-видимому, я должен сгруппировать по всем другим столбцам в операторе выбора.И если я это сделаю, я получу кучу дубликатов, и результат просто не тот, который я хочу.Как я могу заставить этот запрос работать?