Я делаю курс по реляционным базам данных, MySQL, чтобы быть более конкретным.Нам нужно создать несколько запросов SELECT для проекта.Проект связан с музыкой.В нем есть таблицы для представления музыкантов (музыкант), групп (группа) и способности музыканта выполнять определенную задачу, например, петь или играть на гитаре (акт).
Таблица musician
содержит:
id
name
stagename
startyear
Таблица band
содержит:
code
name
type ("band" or "solo")
startyear
И, наконец, таблица act
содержит:
band (foreign key to code of "band" table)
musician (foreign key to id of "musician" table)
hability (guitarist, singer, like that... and a foreign key to another table)
earnings
У меня есть сомнения в двух упражнениях, первое просит выбрать музыкантов id
и stagename
, которые участвуют с большим количеством актов в группах типа solo
.
Мое решение для первогоОдин из них:
SELECT ma.id, ma.stagename
FROM musician ma, act d, band ba
WHERE ma.id = d.musician
AND ba.code = d.band
AND ba.type = "solo"
GROUP BY ma.id, ma.stagename
HAVING COUNT(ma.id) = (SELECT COUNT(d2.musician) AS count
FROM act d2, band ba2
WHERE d2.band = ba2.code
AND ba2.type = "solo"
GROUP BY d2.musician
ORDER BY count DESC
LIMIT 1);
Второй очень похож на последний.Нам нужно выбрать для каждого startyear
id
и stagename
музыканта, который может выполнять больше действий, с соответствующим количеством действий и максимумом и минимумом его кэша.Это мое решение:
SELECT ma.startyear, ma.id, ma.stagename, COUNT(ma.id) AS NumActs, MIN(d.earnings), MAX(d.earnings)
FROM musician ma, act d, band ba
WHERE ma.id = d.musician
AND ba.code = d.band
AND ba.type = "solo"
GROUP BY ma.year, ma.id, ma.stagename
HAVING COUNT(ma.id) = (SELECT COUNT(d2.musician) AS count
FROM act d2, band ba2
WHERE d2.band = ba2.code
AND ba2.type = "solo"
GROUP BY d2.musician
ORDER BY count DESC
LIMIT 1);
Результаты с моими фиктивными данными идеальны, но мой учитель сказал нам, что мы должны избегать использования опции LIMIT
, но это единственный способ получить наибольшее число, прихотя бы с тем, что мы знаем прямо сейчас.
Я видел много подзапросов после оператора FROM
для решения этой проблемы, однако для этого проекта мы не можем использовать подзапросы внутри FROM
.Это действительно возможно без LIMIT
?
Заранее спасибо.