Выберите из таблицы и посчитайте от другого - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть две таблицы, одна для авторов, другая для книг, я хочу посчитать количество книг на автора

Table authors 
+----+-------------------+
|id  | name              |
+----+-------------------+
|1   | PROF. H.D IBRAHIM |
+----+-------------------+
|2   |DR. M.L BUGA       |
--------------------------
Table books
+--+-------------+------------+
|id|name         | author     |
+--+-------------+------------+
|1 |Sabitol      | 1          |
+--+-------------+------------+
|2 | Garlic      | 2,1        |
+--+-------------+------------+
|3 |Gold         | 2          |
+--+-------------+------------+

Я использовал запрос sql:

SELECT authors.id,authors.name, COUNT(books.author) As num 
FROM `authors` 
LEFT JOIN books ON authors.id=books.author 
GROUP BY authors.id;

Запрос возвращает 1 для первого автора вместо 2

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Использовать FIND_IN_SET ()

SELECT
    authors.id,authors.name, COUNT(books.author) As num 
FROM authors
     INNER JOIN books
ON 
    FIND_IN_SET(authors.id,books.author)
GROUP BY 
    authors.id;
0 голосов
/ 21 февраля 2020

Проблема в вашей структуре данных: вы храните список авторов в виде списка, разделенного запятыми, что затрудняет выполнение базовых c операций, таких как объединения. Вам определенно следует исправить свою модель данных, создав соединительную таблицу, чтобы представить отношение «многие ко многим» между книгами и авторами, где каждый автор / кортеж книги будет храниться в отдельной строке. Подробнее о том, почему и как, можно найти в этом знаменитом SO-ответе .

При этом: для этого конкретного c вопроса вы можете присоединиться, используя строку MySQL функция find_in_set(), затем агрегат:

select a.id, a.name, count(*) nb_books
from authors a
left join books b on find_in_set(a.id, b.author)
group by a.id, a.name
...