【问题标题】:how to store result array of joined table in the row result in mysql?如何将连接表的结果数组存储在mysql的行结果中?
【发布时间】:2019-07-07 11:34:23
【问题描述】:

我们有 3 张桌子:

  1. 捐款
  2. 用途
  3. 费用

捐款:

+--------+------+
| do_id  | name |
+--------+------+
|  1     |  A   |
|  2     |  B   |
|  3     |  A   |
|  4     |  D   |
|  5     |  B   |
|  6     |  B   |
|  7     |  A   |
|  8     |  B   |
+--------+----- +

目的:

+-------+-------+--------+
| pu_id | do_id | purpose|
+-------+-------+--------+
|   1   |   2   |  abc   |
|   2   |   2   |  def   |
|   3   |   2   |  gih   |
|   4   |   3   |  jkl   |
+-------+-------+--------+

费用:

+-------+-------+---------+
| ex_id | do_id | expense |
+-------+-------+---------+
|   1   |   2   |   abc   |
|   2   |   2   |   def   |
|   3   |   2   |   gih   |
|   4   |   3   |   jkl   |
+-------+-------+---------+

现在我想查询以获取捐赠者 B 的所有捐款,然后加入 用途表 以获取与每个 donation_id 相关的所有用途加入 expenses table 以获取与 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)

这是我的尝试:

SELECT *, (
    SELECT * 
    FROM `donation_purposes` 
    WHERE `donation_purposes`.`dopu_donation_id` = 4
) AS `purposes` 
FROM `donations` 
WHERE `donation_id` = '4'

提前致谢

【问题讨论】:

  • 这看起来你对如何使用结果相当模糊。您只是将它们视为文本还是最终想要某种 JSON 结构?您可以使用“group by”和“group_concat”来获取一些包含数据的文本,但在您描述的上下文中,我真的看不出它有什么用处。

标签: php mysql sql


【解决方案1】:
  • 第一次选择查询目的

    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
    
  • 第二次选择查询费用

    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
    

生成的所有查询都来自您提供的表结构,但是您的问题很模糊!

【讨论】:

    【解决方案2】:

    您应该能够通过使用MySQL aggregate function 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
    

    我想避免数组中的重复值,并且由于 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 
    

    这个demo on DB Fiddle返回:

    | do_id | purpose               | expenses              |
    | ----- | --------------------- | --------------------- |
    | 2     | ["abc", "def", "gih"] | ["abc", "def", "gih"] |
    | 3     | ["jkl"]               | ["jkl"]               |
    

    【讨论】:

    • 还有其他方法吗,因为我有这个错误 FUNCTION shoryan.JSON_ARRAYAGG 不存在
    • @eng.ahmed 文档说“在 MySQL 5.7.22 中添加”。所以你可能有一个稍微旧的 MySQL 版本。尝试在上面的数据库小提琴中添加这样的内容: CONCAT('["',Group_concat(e.expense separator '","'),'"]') 费用
    猜你喜欢
    • 2016-04-03
    • 2021-06-27
    • 2017-10-25
    • 2010-12-16
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多