首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:有效地为in子句中的每个项获取一行

MySQL:有效地为in子句中的每个项获取一行
EN

Stack Overflow用户
提问于 2011-05-13 05:20:22
回答 3查看 3.9K关注 0票数 4

我有一个包含很多表的MySQL数据库,我有两个表,它们在许多关系中相互链接,使用第三个表。下面是一个简单的演示,展示了它的外观:

表1:书籍

  • 第1行: ID: 15标题:虚拟测试簿1
  • 第2行: ID: 18标题:虚拟测试簿4
  • 第3行: ID: 22标题:虚拟测试簿6
  • 第4行: ID: 10标题:虚拟测试簿8
  • 第5行: ID: 16标题:虚拟测试簿15
  • ..。

表2:作者

  • 第1行: ID: 4名称: Dave
  • 第2行: ID: 8姓名: Robert
  • 第3行: ID: 12名: Amy

表3: books_authors

  • 第1行: author_id: 4 book_id: 15
  • 第1行: author_id: 8 book_id: 22
  • 第1行: author_id: 8 book_id: 10
  • 第1行: author_id: 12 book_id: 16

我要做的是为每个作者获得一个包含最新书籍的随机作者列表,因此我将获得一个包含所有作者I的列表,使用一些脚本来创建该随机列表,然后使用以下查询:

代码语言:javascript
复制
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上,而不是在整个查询上。这有可能吗?如果没有,是否有一种有效的方法来做我想做的事?

谢谢!

大卫

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-13 05:32:52

您可以首先使用最新的id为每个作者选择图书,并将其与图书表连接以获取名称。就像这样:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2011-05-13 05:26:21

对于这个问题,这里有很多解决方案,但是它的要点是,如果您的数据集很大,您最好运行多个查询,每个作者一个。

票数 2
EN

Stack Overflow用户

发布于 2012-02-07 20:03:53

这不是这个问题的确切答案,但对于类似的问题,它对我起了作用。

我有一个来自A,B,C,D,E列的查询的结果集,因为我想对任何D+E类型的结果都要一行(我不在乎),所以我用了一个"group by D,E“函数。

35.000+寄存器,每个列都是varchar(30),Mysql需要766 ms才能完成这项工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5987529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档