[英]Select from a table and count from another
我有两张表,一张用于作者,另一张用于书籍,我想计算每位作者的书籍数量
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
使用 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;
问题在于您的数据结构:您将作者列表存储为逗号分隔的列表,这使得执行诸如连接之类的基本操作变得更加困难。 您绝对应该修复您的数据模型,通过创建一个连接表来表示书籍和作者之间的多对多关系,其中每个作者/书籍元组将存储在单独的行中。 在这个著名的 SO 答案中可以找到更多关于原因和方法的信息。
话虽如此:对于这个特定问题,您可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.