【问题标题】:MySQL one to many relationship in one queryMySQL 一个查询中的一对多关系
【发布时间】:2016-06-13 09:13:42
【问题描述】:

如何在 ONE 查询中获取数据的一对多关系?

示例:一本书有很多作者。

结果返回应该是这样的:

array(
   'book_title' => 'HTML for Dummies',
   'book_desc'  => '...',
   'authors' => array(
       [0] => array(
           'name' => 'Someone',
           'dob'  => '...'
       ),
       [1] => array(
           'name' => 'Someone',
           'dob'  => '...'
       )
    )
)

我曾尝试使用子查询来选择结果,但不是运气:

SELECT *, (
    SELECT * 
    FROM authors
    WHERE book_id = b.id
) AS authors
FROM book b;

Mysql 错误 "Operand should contain 1 column(s)" 这意味着我只能选择一列。

您可能会建议我使用 join 但它如何像我向您展示的那样存档返回结果格式?

【问题讨论】:

  • 第一个SELECT *后面有个逗号
  • 您希望 SQL 从一个查询中返回嵌套表吗?如果是这样,我想你注定要失望了。单个查询只能返回单个平面表。但是,您可以将表连接起来,然后使用 PHP 将结果处理成所需的数组格式
  • @ADyson 感谢您的建议。我只是想寻找更好的解决方案。
  • @EdwinWong 我同意这令人沮丧。 SQL 在设计时并没有特别考虑 OO 编程。如果您对使用面向对象的方法更内联地存储数据感兴趣,您可能需要考虑使用 NoSQL 类型的数据库而不是 MySQL,例如 MongoDB 或 CouchDB。
  • 如果我们想在书籍上做分页器,那么用1个查询可以做到吗?

标签: mysql one-to-many


【解决方案1】:
SELECT 
 B.id AS book_id, B.name AS book_name,
 A.name AS author_name ,A.ID AS author_id 
FROM book B
LEFT JOIN 
 author A ON B.id = A.book_id;

参考:http://sqlfiddle.com/#!9/633cfa1/2

您的输出将是数字数组。

Array
(
    [0] => Array
        (
            [bookId] => 1
            [bookName] => Book 1
            [authorId] => 1
            [authorName] => Author 1
        )

    [1] => Array
        (
            [bookId] => 1
            [bookName] => Book 1
            [authorId] => 2
            [authorName] => Author 2
        )

    [2] => Array
        (
            [bookId] => 2
            [bookName] => Book 2
            [authorId] => 3
            [authorName] => Author 3
        )

    [3] => Array
        (
            [bookId] => 3
            [bookName] => Book 3
            [authorId] => 4
            [authorName] => Author 4
        )

)

将此数组转换为多维数组

Array
(
    [0] => Array
        (
            [bookId] => 1
            [bookName] => Book 1
            [authorName] => Array
                (
                    [0] => Author 1
                    [1] => Author 2
                )

        )

    [1] => Array
        (
            [bookId] => 2
            [bookName] => Book 2
            [authorName] => Array
                (
                    [2] => Author 3
                )

        )

    [2] => Array
        (
            [bookId] => 3
            [bookName] => Book 3
            [authorName] => Array
                (
                    [3] => Author 4
                )

        )

)

参考:https://3v4l.org/q1dli

【讨论】:

  • 谢谢扎赫夫隆!这个很有用~只要把那个PHP脚本变成实用函数,就可以适用于所有了。
  • 我有一个案例,我想将答案转换回对象数组,对于任何有类似用例的人,您始终可以使用array_values()
  • @zakhefron 你如何将numeric array 转换为multi-dimensional array。 ?有什么想法吗?
【解决方案2】:

如果您想快速简单地完成此操作,请使用带有适当分隔符的GROUP_CONCAT。然后在您的 PHP 应用程序(或您使用的任何语言)中拆分生成的串联字符串字段,以快速获取您想要的内部数组。

这样做的好处是输出中每本书只有一行。

【讨论】:

    【解决方案3】:

    从 mysql 获取数据的方式可能并不容易。 Mysql 将按行返回。所以书籍或作者都会在结果集中重复。你必须相应地解析mysql结果来准备你的数组。

    尝试以下操作:

    1) 作者以逗号分隔的所有书籍。

    "SELECT B.*,group_concat(a.id) as authors 
     From book b inner join authors as a on b.author_id=a.id 
     group by b.id;"
    

    2) 所有作者都有书籍详情:

    "SELECT A.*,group_concat(B.id) as books 
     From book B inner join authors as A on B.author_id=A.id 
     group by A.id;"
    

    【讨论】:

    • 感谢Piyush~下面的查询还是需要运行第二个查询才能运行第二个查询来获取作者信息
    【解决方案4】:
    SELECT b.*, a.*
    FROM book b
    INNER JOIN authors a ON (a.book_id = b.id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多