MySQL:为in子句中的每个项目获取一行

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图书编号

我有一个包含很多表的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图书编号:15
  • 第1行:作者编号:8图书编号:22
  • 第1行:作者编号:8图书编号:10
  • 第1行:作者编号:12本书编号:16
  • 我试图做的是获得一个随机的作者列表,每个作者都有一本最新的书,因此我得到一个包含所有作者ID的列表,使用一些脚本创建该随机列表,然后我使用以下查询:

    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)