简体   繁体   English

如何在mysql的行结果中存储联接表的结果数组?

[英]how to store result array of joined table in the row result in mysql?

We have 3 tables : 我们有3张桌子:

  1. donations 捐款
  2. purposes 目的
  3. expenses 花费

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM