Не знаете, как создать SQL-запрос для упомянутой задачи - PullRequest
0 голосов
/ 28 октября 2018

Это мои таблицы:

concerts (
    concert_id: INT, 
    name: VARCHAR(200), 
    venue: VARCHAR(200), 
    schedule: DATETIME) 

singers (
    singer_id: INT, 
    name: VARCHAR(200), 
    gender: ENUM('male', 'female', 'other')) 

performances(singer_id: INT, 
    concert_id: INT) 
Foreign keys: {singer_id} to singers {concert_id} to concerts 

Я пытаюсь найти запрос, чтобы перечислить все концерты певца, который выступил более чем на 5 концертах в 2018 году.2018 - это определяемые пользователем переменные (сейчас я их проверяю) Я попробовал несколько попыток, и, кажется, ничто не может приблизиться к задаче, которую я пытаюсь достичь.Буду признателен за любую помощь в отношении того же.

1 Ответ

0 голосов
/ 28 октября 2018
  • В запросе дополнительного выбора ( Производная таблица ) мы можем сначала определить все значения singer_id, которые имеют более 5 концертов в 2018 году. Мы используем Group By с функцией Count(...), чтобы определить общее количество концертов для singer_id. Обратите внимание , что если у вас есть дублирующиеся строки для комбинации singer_id и concert_id в таблице performances, вам нужно будет использовать функцию Count(Distinct ...).Теперь мы можем использовать предложение Having, чтобы рассмотреть только тех певцов, у которых число больше 5.
  • Теперь просто Join этот набор результатов производной таблицы для основных таблиц, чтобыполучить список концертов 2018 года.

Попробуйте следующий запрос:

SELECT c1.*, s1.*
FROM 
concerts AS c1 
JOIN performances AS p1 ON p1.concert_id = c1.concert_id 
JOIN 
(
  SELECT
    s.singer_id, 
    COUNT(c.concert_id) AS num_concerts 
  FROM 
    singers AS s 
  JOIN performances AS p ON p.singer_id = s.singer_id 
  JOIN concerts AS c ON c.concert.id = p.concert_id AND 
                        c.schedule >= '2018-01-01' AND 
                        c.schedule < '2019-01-01'
  GROUP BY s.singer_id 
  HAVING num_concerts > 5
) AS dt ON dt.singer_id = p1.singer_id 
JOIN singers AS s1 ON s1.id = dt.singer_id 
WHERE c1.schedule >= '2018-01-01' 
  AND c1.schedule < '2019-01-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...