[英]MySQL one to many relationship in one query
如何在一个查询中获取一对多关系数据?
示例:一本书有很多作者。
结果返回应该是这样的:
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列”,这意味着我只能选择一列。
您可能会建议我使用联接,但它如何归档返回结果格式,就像我向您展示的那样?
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;
您的输出将是数字数组。
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
如果您想快速而简单地使用它,请使用具有适当分隔符的GROUP_CONCAT
。 然后在PHP应用程序(或您正在使用的任何语言)中分割生成的连接字符串字段,以快速获取所需的内部数组。
这样做的好处是输出中每本书只有一行。
SELECT b.*, a.*
FROM book b
INNER JOIN authors a ON (a.book_id = b.id);
从mysql中获取数据可能并不容易。 Mysql将以行方式返回。 所以书籍或作者都会在结果集中重复。 并且你必须相应地解析mysql结果以准备你的数组。
试试以下:
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;"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.