#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. Большое вам спасибо! Я был так близок, но совершенно пропустил утверждение «ИМЕТЬ». Проблема решена!