MySQL 一个查询中的一对多关系
MySQL one to many relationship in one query
如何在 ONE 查询中获取一对多关系的数据?
示例:一本书有很多作者。
结果return应该是这样的:
array(
'book_title' => 'HTML for Dummies',
'book_desc' => '...',
'authors' => array(
[0] => array(
'name' => 'Someone',
'dob' => '...'
),
[1] => array(
'name' => 'Someone',
'dob' => '...'
)
)
)
我已经尝试使用子查询来 select 结果但不是运气:
SELECT *, (
SELECT *
FROM authors
WHERE book_id = b.id
) AS authors
FROM book b;
Mysql 错误 "Operand should contain 1 column(s)" 这意味着我只能 select 一栏。
您可能会建议我使用 join,但它如何像我向您展示的那样归档 return 结果格式?
SELECT b.*, a.*
FROM book b
INNER JOIN authors a ON (a.book_id = b.id);
从 mysql 开始,您想要数据的方式可能并不容易。 Mysql 将 return 按行排列。所以无论是书籍还是作者都会在结果集中重复。你必须相应地解析 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;"
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
)
)
)
Refer : https://3v4l.org/q1dli
如果您想快速简单地完成,请使用 GROUP_CONCAT
和适当的分隔符。然后在您的 PHP 应用程序(或您使用的任何语言)中拆分生成的串联字符串字段,以快速获取您想要的内部数组。
这样做的好处是输出中每本书只有一行。
如何在 ONE 查询中获取一对多关系的数据?
示例:一本书有很多作者。
结果return应该是这样的:
array(
'book_title' => 'HTML for Dummies',
'book_desc' => '...',
'authors' => array(
[0] => array(
'name' => 'Someone',
'dob' => '...'
),
[1] => array(
'name' => 'Someone',
'dob' => '...'
)
)
)
我已经尝试使用子查询来 select 结果但不是运气:
SELECT *, (
SELECT *
FROM authors
WHERE book_id = b.id
) AS authors
FROM book b;
Mysql 错误 "Operand should contain 1 column(s)" 这意味着我只能 select 一栏。
您可能会建议我使用 join,但它如何像我向您展示的那样归档 return 结果格式?
SELECT b.*, a.*
FROM book b
INNER JOIN authors a ON (a.book_id = b.id);
从 mysql 开始,您想要数据的方式可能并不容易。 Mysql 将 return 按行排列。所以无论是书籍还是作者都会在结果集中重复。你必须相应地解析 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;"
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
)
)
)
Refer : https://3v4l.org/q1dli
如果您想快速简单地完成,请使用 GROUP_CONCAT
和适当的分隔符。然后在您的 PHP 应用程序(或您使用的任何语言)中拆分生成的串联字符串字段,以快速获取您想要的内部数组。
这样做的好处是输出中每本书只有一行。