#mysql #sql
Вопрос:
Мы с другом создаем макет базы данных проката фильмов. У нас возникли проблемы с командой select.
Список всех фильмов, показывающий, как часто (количество) фильмов было взято напрокат в зависимости от национальности клиентов. Сортировка по частоте (первая по величине).
Мы попытались сгруппировать счетчик(идентификатор), однако он отображается в виде отдельных строк
----------------------------------------------- ------------- -----------
| name | Country | Rental |
----------------------------------------------- ------------- -----------
| Star Wars | USA | 1 |
| Star Wars | France | 1 |
| Star Wars | India | 1 |
| Star Wars | Italy | 1 |
| Star Wars | USA | 1 |
но мы хотим чего-то подобного
----------------------------------------------- ------------- -----------
| name | Country | Rental |
----------------------------------------------- ------------- -----------
| Star Wars | USA | 2 |
| Star Wars | France | 1 |
| Star Wars | India | 1 |
| Star Wars | Italy | 1 |
команда «Выбрать» прямо сейчас выглядит так
select Film.name as Film, Nationality.country as Country, count(ausleihen.ausleih_id) as Ausleihen
from
Nationality
join Client on Nationality.nationality_id = Client.nationality_id
join rental on Client.client_id = rental.client_id
join Film on rental.film_id = Film.film_id
group by rental.rental_id
order by film.name;
наши столы выглядят так:
create table rental(
rental_id serial,
film_id bigint unsigned not null,
client_id bigint unsigned not null,
rental_price float(25) not null,
rental_date date,
return_date date,
primary key(ausleih_id),
foreign key(film_id) references Film(film_id) on update cascade on delete restrict,
foreign key(client_id) references Client(client_id) on update cascade on delete restrict
);
create table Film(
film_id serial,
category_id bigint unsigned not null,
name varchar(255) not null,
film_price float(25) not null,
primary key(film_id),
foreign key (category_id) references Category(category_id) on update cascade on delete cascade
);
create table Nationality(
nationality_id serial,
country varchar(255) not null,
primary key(nationality_id)
);
Комментарии:
1. Измените свою группу на
group by Film.name, Nationality.country
2. ауслейхен не входит в критерии присоединения. это стол
Ответ №1:
Вам нужно агрегировать по правильным столбцам:
select f.name as Film, n.country as Country, count(*) as Ausleihen
from Nationality n join
Client c
on n.nationality_id = c.nationality_id join
rental r
on c.client_id = r.client_id join
Film f
on r.film_id = f.film_id
group by f.name as Film, n.country
order by f.name;
Обратите внимание, что псевдонимы таблиц облегчают написание и чтение запроса.