SQL добавляет числа в одну и ту же страну

#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;
 

Обратите внимание, что псевдонимы таблиц облегчают написание и чтение запроса.