我有一个包含很多表的MySQL数据库,我有两个表,它们在许多关系中相互链接,使用第三个表。下面是一个简单的演示,展示了它的外观:
表1:书籍
表2:作者
表3: books_authors
我要做的是为每个作者获得一个包含最新书籍的随机作者列表,因此我将获得一个包含所有作者I的列表,使用一些脚本来创建该随机列表,然后使用以下查询:
SELECT
`books`.`ID`,
`books`.`Name`
FROM `books`
LEFT JOIN `books_authors` ON `books`.`ID` = `books_authors`.`book_id`
LEFT JOIN `authors` ON `books_authors`.`author_id` = `authors`.`ID`
WHERE `authors`.`ID` IN(8, 12)
LIMIT 1问题是,限制1意味着我只能得到一本书,而我想要两本书,每个作者一本。在不对每个作者运行查询的情况下,我如何做到这一点?(数据库很大,每个作者的查询都会使服务器爬行)。如果我增加限制,那么我不一定得到两本书一个一个,但我可以得到两本书由同一作者。
换句话说,我希望限制在IN上,而不是在整个查询上。这有可能吗?如果没有,是否有一种有效的方法来做我想做的事?
谢谢!
大卫
发布于 2011-05-13 05:32:52
您可以首先使用最新的id为每个作者选择图书,并将其与图书表连接以获取名称。就像这样:
SELECT
`books`.`ID`,
`books`.`Name`
FROM `books`
INNER JOIN (
select max(book_id), author_id
from `books_authors`
group by author_id) ba ON `books`.`ID` = ba.`book_id`
WHERE ba.author_id IN (8, 12)发布于 2011-05-13 05:26:21
对于这个问题,这里有很多解决方案,但是它的要点是,如果您的数据集很大,您最好运行多个查询,每个作者一个。
发布于 2012-02-07 20:03:53
这不是这个问题的确切答案,但对于类似的问题,它对我起了作用。
我有一个来自A,B,C,D,E列的查询的结果集,因为我想对任何D+E类型的结果都要一行(我不在乎),所以我用了一个"group by D,E“函数。
35.000+寄存器,每个列都是varchar(30),Mysql需要766 ms才能完成这项工作。
https://stackoverflow.com/questions/5987529
复制相似问题