我的数据库中有一本书(60,000本书)和作者(37,000位作者).一本书可能由多位作者撰写.因此,book表在book表的author_id列中使用逗号分隔的author_ids
书桌
book_master_id book_name author_id
1 Book 1 22,23
2 Book 2 23
3 Book 3 24
4 Book 4 23,24
作者表
author_id author_name
22 Jim
23 Roger
24 Andrew
现在,如果我想将结果作为作者姓名,并按书写计数的降序排列.即
Roger(3)
Andrew(2)
Jim(1)
什么应该是MySQL查询???请告诉我步骤.
还要将执行时间视为最小值
谢谢
解决方法:
您应该规范化数据库表,正如其他几个人已经提到的那样.结果数据库结构应如下所示:
BOOK_MASTER
book_master_id book_name
1 Book 1
2 Book 2
3 Book 3
4 Book 4
AUTHOR
author_id author_name
22 Jim
23 Roger
24 Andrew
BOOK_AUTHOR
book_master_id author_id
1 22
1 23
2 23
3 24
4 23
4 24
SELECT
a.author_name,
COUNT(*) as number_of_books
FROM
author a
JOIN book_author ba ON a.id = ba.author_id
GROUP BY
a.author_name
ORDER BY number_of_books DESC
编写一个脚本,将当前书籍表的author_id逗号分隔列表移动到新的author_book表中应该是相当简单的,下面的内容可能会起作用:
<?PHP
$query = "SELECT book_master_id, author_id FROM books";
$result = MysqL_query($query);
while ($row = MysqL_fetch_row($result)) {
$values = array();
foreach (explode(',', $row['author_id']) as $authorId) {
$values[] = "(" . $row['book_master_id'] . ", " . $authorId . ")";
}
$query = "INSERT IGnorE INTO book_author (book_master_id, author_id) VALUES ";
$query .= implode(', ', $values);
MysqL_query($query);
}
请注意,我没有测试这段代码,你应该首先在测试数据库上试一试,看看它是否真的能够完成它应该做的事情.此外,如果您有大量数据,则此脚本可能需要一些时间才能执行.最后,也许有一个SQL查询可以做到这一点,但这是第一个想到的解决方案.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。