一次查询中的MySQL一对多关系
如何在one查询中获取数据一对多关系 一本书有许多作者 返回的结果应如下所示:一次查询中的MySQL一对多关系,mysql,one-to-many,Mysql,One To Many,如何在one查询中获取数据一对多关系 一本书有许多作者 返回的结果应如下所示: array( 'book_title' => 'HTML for Dummies', 'book_desc' => '...', 'authors' => array( [0] => array( 'name' => 'Someone', 'dob' => '...' ),
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错误“操作数应包含1列”,这意味着我只能选择一列
您可能会建议我使用join,但它如何像我向您展示的那样归档返回结果格式?从mysql获取数据的方法可能并不容易。Mysql将以行方式返回。所以书或作者都会在结果集中重复。您必须相应地解析mysql结果以准备数组
SELECT b.*, a.*
FROM book b
INNER JOIN authors a ON (a.book_id = b.id);
请尝试以下操作:
1) 以逗号分隔ID显示作者的所有书籍
"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;"
参考:
您的输出将是数字数组
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
)
)
)
参考:
如果要快速、简单地执行此操作,请使用适当的分隔符。然后在PHP应用程序(或您正在使用的任何语言)中拆分生成的串联字符串字段,以快速获得所需的内部数组
这样做的好处是输出中每本书只有一行。第一行之后有一个逗号
SELECT*
您希望SQL从一个查询返回嵌套表吗?如果是这样,我想你注定会失望。单个查询只能返回单个平面表。但是,您可以连接这些表,然后使用PHP将结果处理到所需的数组中format@ADyson谢谢你的建议。我只是想寻找更好的解决办法。@EdwinWong我同意这是令人沮丧的。SQL在设计时并没有特别考虑OO编程。如果您有兴趣将数据存储在面向对象的方法中,您可能需要考虑NoSQL类型的数据库而不是MySQL,如MunGDB或CouCHDB。谢谢Piyush ~下面的查询仍然需要运行第二个查询来运行第二个查询以获得作者信息,谢谢ZAHEFFRON!这很有用~只需要将PHP脚本转换为实用函数,这样就可以应用于所有对象。我曾经有一个案例,我想将答案转换回对象数组,对于任何具有类似用例的人,您都可以使用array\u values()
@zakhefron如何将数值数组
转换为多维数组
?有什么想法吗?
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
)
)
)