Получите комбинированный результат в MySQL - PullRequest
0 голосов
/ 06 мая 2020

У меня 5 таблиц в Mysql, и мне нужен комбинированный результат из всех таблиц. Таблицы выглядят следующим образом:

1) library_book_relation

CREATE TABLE db.library_book_relation ( 
    id                   int  NOT NULL  AUTO_INCREMENT  PRIMARY KEY,
    library_id             int      ,
    book_item_id      int      ,
    seller_price         decimal(10,2)      ,
    pack_quantity        decimal(10,2)      ,
    is_discontinue       tinyint      ,
    total_quantity       decimal(10,2)      ,     
 ) ;

2) элемент_книги

CREATE TABLE db.`book_item` ( 
    id                   int  NOT NULL  AUTO_INCREMENT  PRIMARY KEY,
    book_id           int      ,
    size_unit_id         tinyint      ,
    size                 decimal(10,2)      ,
    is_active            boolean      ,
    is_deleted           boolean      ,   
 )  ;

3) книга

CREATE TABLE db.book( 
    id                   int  NOT NULL  AUTO_INCREMENT  PRIMARY KEY,
    name                 varchar(100)      ,
    author_id             int      ,
    description          varchar(256)      ,
    is_active            boolean      ,
    is_deleted           boolean      ,

 ) ;

4) автор

CREATE TABLE db.author( 
    id                   int  NOT NULL  AUTO_INCREMENT  PRIMARY KEY,
    name                 varchar(100)      ,
    image                varchar(256)      ,
    description          varchar(256)      ,
    is_active            tinyint      ,
    is_deleted           tinyint      ,
 ) ;

5) size_unit

CREATE TABLE db.size_unit ( 
    id                   tinyint  NOT NULL    PRIMARY KEY,
    name                 varchar(100)      ,
    is_active            tinyint      ,
 ) ;

Мне нужен комбинированный результат, в котором я получаю

author id
author name 
count of books for the author in library

Я получил все 3 в разных запросах, но не знаю, как объединить результат

для получения идентификатора и имени автора

select id,name FROM author where id IN( select e.id from author e inner join book r on e.id = r.author_id where r.id IN( select q.id from book q inner join book_item w on q.id = w.book_id where w.id IN( Select s.id from book_item s inner join library_book_relation d on s.id=d.book_item_id where d.library_id = 1 )))

для подсчета книг для автора в библиотеке

(Select COUNT(*) FROM book where author_id IN ( select e.id from author e inner join book r on e.id = r.author_id where r.id IN( select q.id from book q inner join book_item w on q.id = w.book_id where w.id IN( Select s.id from book_item s inner join library_book_relation d on s.id=d.book_item_id where d.library_id = 1 ))) GROUP BY author_id)

1 Ответ

0 голосов
/ 06 мая 2020

Самый простой способ - объединить все таблицы, сгруппировать по автору и библиотеке и подсчитать:

select b.author_id, a.name, lbr.library_id, count(*)
from book b
join book_item bi on bi.book_id = b.id
join library_book_relation lbr on lbr.book_item_id = bi.id
join author a on a.id = b.author_id
group by b.author_id, a.name, lbr.library_id
order by b.author_id, a.name, lbr.library_id;

На SQL стандарт, вам нужно только group by b.author_id, lbr.library_id, потому что вам нужна одна строка результатов на автора и библиотека. MySQL должен уметь это делать, поэтому вы можете удалить a.name из предложения group by. (Существует только одно имя для каждого идентификатора автора.)

Вы также можете подсчитать, прежде чем присоединиться к таблице авторов. Считается хорошим стилем агрегирование перед присоединением и может очень помочь (или даже оказаться необходимым) в более сложных запросах.

select c.author_id, a.name, c.library_id, c.books
from
(
  select b.author_id, lbr.library_id, count(*) as books
  from book b
  join book_item bi on bi.book_id = b.id
  join library_book_relation lbr on lbr.book_item_id = bi.id
  group by b.author_id, lbr.library_id
) c
join author a on a.id = c.author_id
order by c.author_id, a.name, c.library_id;

Однако вышеперечисленные запросы не учитывают нули. Они просто показывают, как часто можно найти авторов в библиотеках. Вот как подсчитать, сколько книг у автора №1 в библиотеке № 123:

select a.id, a.name, coalesce(b.books, 0)
from author a
left join
(
  select b.author_id, count(*) as books
  from book b
  join book_item bi on bi.book_id = b.id
  join library_book_relation lbr on lbr.book_item_id = bi.id
  where lbr.library_id = 123
  group by b.author_id
) c on c.author_id = a.id
where a.id = 1;

Или с помощью подзапроса в предложении select:

select
  a.id,
  a.name, 
  (
    select count(*)
    from book b
    join book_item bi on bi.book_id = b.id
    join library_book_relation lbr on lbr.book_item_id = bi.id
    where lbr.library_id = 123
    and b.author_id = a.id
  ) as books
from author a
where a.id = 1;

Наконец, запрос на получение все авторы и все библиотеки, включая нули:

select a.id as author_id, a.name, l.id as library_id, coalesce(c.books, 0)
from author a
cross join library l
left join
(
  select b.author_id, lbr.library_id, count(*) as books
  from book b
  join book_item bi on bi.book_id = b.id
  join library_book_relation lbr on lbr.book_item_id = bi.id
  group by b.author_id, lbr.library_id
) c on c.author_id = a.id and c.library_id = l.id
order by a.id, l.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...