[英]how to store result array of joined table in the row result in mysql?
We have 3 tables : 我们有3张桌子:
Donations : 捐款:
+--------+------+
| do_id | name |
+--------+------+
| 1 | A |
| 2 | B |
| 3 | A |
| 4 | D |
| 5 | B |
| 6 | B |
| 7 | A |
| 8 | B |
+--------+----- +
purposes: 用途:
+-------+-------+--------+
| pu_id | do_id | purpose|
+-------+-------+--------+
| 1 | 2 | abc |
| 2 | 2 | def |
| 3 | 2 | gih |
| 4 | 3 | jkl |
+-------+-------+--------+
expense : 费用:
+-------+-------+---------+
| ex_id | do_id | expense |
+-------+-------+---------+
| 1 | 2 | abc |
| 2 | 2 | def |
| 3 | 2 | gih |
| 4 | 3 | jkl |
+-------+-------+---------+
Now i want to make query to get all donations for donor B and join purposes table to get all purposes related to every donation_id then join expenses table to get all expenses related to donation_id and put all of that in every loop independently something like that 现在我要查询以获取捐赠者B的所有捐款,并加入目的表以获取与每个donation_id有关的所有目的,然后加入费用表以获取与donation_id有关的所有费用并将所有这些独立地放入每个循环中,例如
Row number 0
donation_id = 1
array(purposes)
array(expenses)
Row number 1
donation_id = 2
array(purposes)
array(expenses)
Row number 2
donation_id = 3
array(purposes)
array(expenses)
Row number 3
donation_id = 4
array(purposes)
array(expenses)
This is my try : 这是我的尝试:
SELECT *, (
SELECT *
FROM `donation_purposes`
WHERE `donation_purposes`.`dopu_donation_id` = 4
) AS `purposes`
FROM `donations`
WHERE `donation_id` = '4'
thanks in advance 提前致谢
You should be able to solive this with an aggregate query using MySQL aggregate function JSON_ARRAYAGG()
, like : 您应该能够使用MySQL聚合函数
JSON_ARRAYAGG()
通过聚合查询来解决这个问题,例如:
SELECT
d.do_id,
JSON_ARRAYAGG(p.purpose) purposes,
JSON_ARRAYAGG(e.expense) expenses
FROM donations d
INNER JOIN purposes p ON p.do_id = d.do_id
INNER JOIN expense e ON e.do_id = d.do_id
GROUP BY d.do_id
I you want to avoid duplicate values in the array, and as JSON_ARRAYAGG()
(sadly) does not support the DISTINCT
option, you can move aggregation to subqueries, like : 我想避免数组中出现重复的值,并且由于
JSON_ARRAYAGG()
(不幸)不支持DISTINCT
选项,因此可以将聚合移至子查询,例如:
SELECT
d.do_id,
p.agg purpose,
e.agg expenses
FROM donations d
INNER JOIN (
SELECT do_id, JSON_ARRAYAGG(purpose) agg FROM purposes GROUP BY do_id
) p ON p.do_id = d.do_id
INNER JOIN (
SELECT do_id, JSON_ARRAYAGG(expense) agg FROM expense GROUP BY do_id
) e ON e.do_id = d.do_id
This demo on DB Fiddle returns : DB Fiddle上的此演示返回:
| do_id | purpose | expenses |
| ----- | --------------------- | --------------------- |
| 2 | ["abc", "def", "gih"] | ["abc", "def", "gih"] |
| 3 | ["jkl"] | ["jkl"] |
1st Select Query Purposes 第一选择查询目的
SELECT purposes.* FROM purposes LEFT JOIN donations ON purposes.do_id = donations.do_id WHERE donations.do_id = '2' //This depends on the id of the donation ORDER BY purposes.do_id ASC
2nd Select Query Expenses 第二次选择查询费用
SELECT expense.* FROM expense LEFT JOIN donations ON expense.do_id = donations.do_id WHERE donations.do_id = '2' //This depends on the id of the donation ORDER BY expense.ex_id ASC
All queries generated are from the table structure you've provided, but your question is quite vague!! 生成的所有查询都来自您提供的表结构,但是您的问题很模糊!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.