Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не уверен что правильно написан запрос...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
asker
Отправлено: 17 Июня, 2018 - 20:16:36
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Привет

Вроде простая задача, но 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;
 
 Top
haveFun
Отправлено: 13 Июля, 2018 - 18:26:00
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




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

(Отредактировано автором: 13 Июля, 2018 - 18:30:45)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB