MySQL:为in子句中的每个项目获取一行
我有一个包含很多表的MySQL数据库,我有两个表,它们以多对多的关系相互链接,使用第三个表。下面是它的简化演示: 表1:书籍MySQL:为in子句中的每个项目获取一行,mysql,limit,where,Mysql,Limit,Where,我有一个包含很多表的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姓名:艾米 表3:书籍和作者 第1行:作者编号:4图书编号
- 第1行:ID:15标题:虚拟测试手册1
- 第2行:ID:18标题:虚拟测试手册4
- 第3行:ID:22标题:虚拟测试手册6
- 第4行:ID:10标题:虚拟测试手册8
- 第5行:ID:16标题:虚拟测试手册15
- 。。。
- 第1行:ID:4姓名:Dave
- 第2行:ID:8姓名:Robert
- 第3行:ID:12姓名:艾米
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上,而不是整个查询上。可能吗?如果没有,有没有一种有效的方法来做我想做的事情 谢谢
David这个问题有很多解决方案,但其要点是,如果您的数据集很大,您最好运行多个查询,每个作者一个。您可以首先为每个作者选择最新id的书籍,并将其与books表连接以获得名称。诸如此类:
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)
这并不完全是这个问题的答案,但它对我解决类似的问题起到了作用 我有一个来自a、B、C、D、E列的查询的结果集。因为我希望任何D+E类型的结果都有一行(我不在乎哪一行),所以我使用了“按D、E分组”函数
35.000多个寄存器,每个列都是varchar(30),Mysql需要766毫秒才能完成这项工作。每个作者需要哪本书?最新的?有人吗?顺便说一句,你不需要
左连接
,而是使用内部连接
。“对每个作者的查询将使服务器陷入爬行状态”,因此请雇佣一名DBA。当你说“最新”的书时,你是指max(book\u id)
?我在没有连接的情况下也有同样的问题….$result=mysql\u查询(“从表1中选择总计,其中客户='$client'和('Car'、'Van'、'Bike'、'Bus')订单中的活动按id描述限制4”);是,最新的图书。或Max(图书id)