Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Не уверен что правильно написан запрос...

Страниц (1): [1]
 

1. asker - 17 Июня, 2018 - 20:16:36 - перейти к сообщению
Привет

Вроде простая задача, но mysql знаю плохо поэтому прошу проверить.
БД это таблица авторов, ими написаных книг и отношение соответственно один к многим.
Задача - вытащить список книг, которые написаны 3-мя со-авторами. То есть получить отчет «книга — количество соавторов» и отфильтровать те, у которых со-авторов меньше 3х.

мой вариант такой, насколько правильно и можно ли улучшить ?

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE author (
  2. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. NAME VARCHAR(255) NOT NULL);
  4.  
  5. CREATE TABLE book (
  6. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  7. NAME VARCHAR(255) NOT NULL);
  8.  
  9. CREATE TABLE author_book (
  10. id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  11. author_id INT NOT NULL,
  12. book_id INT NOT NULL);
  13.  
  14. SELECT * FROM book b INNER JOIN author_book ab ON b.id = ab.`book_id`
  15. INNER JOIN author a ON a.id = ab.`author_id`
  16. GROUP BY b.`name`
  17. HAVING COUNT(*) = 3;
2. haveFun - 13 Июля, 2018 - 18:26:00 - перейти к сообщению
1. если нужен
Цитата:
отчет «книга — количество соавторов»

то зачем вообще джойнить таблицу авторов?
2. зачем делать селект всех полей? если нужно только название книги и кол-во авторов?

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT b.name, count(ab.id) cnt
  3. FROM author_book ab
  4. LEFT JOIN book b ON b.id = ab. book_id
  5. GROUP BY ab.book_id
  6. HAVING cnt = 3
  7.  


3. названия полей лучше создавать в одном регистре, а не так:
Цитата:

id int
NAME varchar(255)


4. primary key имеет смысл делать unsigned

 

Powered by ExBB FM 1.0 RC1