繁体   English   中英

从一个表中选择并从另一个表中计数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM