Запрос ВЫБОРА отношения Sqlite «Один Ко Многим»

#python #database #sqlite #group-by #one-to-many

#питон #База данных #sqlite #группа-по #один ко многим

Вопрос:

Предварительные условия

В моем файле есть две таблицы (речь идет о виниловых пластинках).:

Записи

ID Название
1 Название_1
2 Title_2

Стили

ID рекордИд Стиль
1 1 Блюз
2 1 Дискотека
3 2 Блюз
4 2 Электро

(Styles.style хранится в виде целого числа, но для простоты здесь используется строка)

Для стилей таблиц задано следующее условие:
Styles.RecordID = Записи.Идентификатор для каждой данной виниловой пластинки

-gt;Это необходимо для поиска всех стилей, связанных с одной конкретной виниловой пластинкой

Таким образом, хранятся два винила:

Title_1 имеет два стиля Блюз, Диско
Title_2 имеет два стиля Блюз, Электро

Вопрос

В моем запросе SELECT я хочу найти виниловые пластинки с определенным стилем

Найдите названия в одном стиле

Если я хочу найти виниловую пластинку с одним определенным стилем, это кажется довольно простым делом.
Я использую:

 SELECT Records.Title FROM Records JOIN Styles ON Styles.recordId = Records.ID WHERE Styles.style=Disco  

С желаемым результатом:

 (Title_1)  

Найдите названия с большим количеством стилей

Допустим, я хочу найти все названия со стилями (Блюз И Электро)
, используя предыдущее утверждение, и просто добавить другое утверждение, похоже, не работает:

 SELECT Records.Title FROM Records JOIN Styles ON Styles.recordId = Records.ID WHERE Styles.style=Blues AND Styles.style=Electro  

Это не работает в качестве стилей столбцов.стиль никогда не состоит из обоих стилей одновременно.

Как я могу сказать SQLite, чтобы он возвращал все заголовки, которые удовлетворяют этому требованию? Результат должен быть

 (Title_2)  

ИЗМЕНИТЬ: Исправлено, что таблицы не отображаются

Ответ №1:

Для этого вам нужно отфильтровать строки вашего набора результатов для нужных вам стилей и агрегировать с условием в HAVING предложении, что для заголовка существуют оба стиля:

 SELECT r.id, r.Title FROM Records r JOIN Styles s  ON s.recordId = r.ID WHERE s.style IN ('Blues', 'Electro') GROUP BY r.id, r.Title HAVING COUNT(*) = 2;  

Я предполагаю, что в таблице style комбинация столбцов recordId и style уникальна.

Комментарии:

1. Большое вам спасибо! Я был так близок, но совершенно пропустил утверждение «ИМЕТЬ». Проблема решена!