首页 > 解决方案 > 如何在mysql中将数组作为列的值返回

问题描述

我们是 NGO 组织,我们有每个月都捐赠的捐赠者,所以我想显示一个表格,显示捐赠者的姓名以及所有月份和每个月的下方,如果他捐赠了本月的捐赠,则设置为 true,否则设置为 false。

类似的东西

+-------+-----+-----+-----+-----+-----+
| Donor | Jan | Feb | Mar | Apr | May |
+-------+-----+-----+-----+-----+-----+
|   A   |  1  |  1  |  0  |  1  |  1  |
|   B   |  0  |  1  |  0  |  1  |  1  |
|   C   |  1  |  0  |  0  |  1  |  1  |
|   D   |  1  |  1  |  0  |  1  |  0  |
+-------+-----+-----+-----+-----+-----+

现在我在 mysql 数据库中创建 2 个表:1)- Donors 2)- Donation_Months

捐助者:

+-----+------+
| id  | name |
+-----+------+
|  1  |  A   |
|  2  |  B   |
|  3  |  C   |
|  4  |  D   |
+-----+----- +

Donation_Months :

+-------+-------+-------+
| dm_id | do_id | month |
+-------+-------+-------+
|   1   |   2   |  Jan  |
|   2   |   2   |  Feb  |
|   3   |   2   |  Mar  |
|   4   |   2   |  Apr  |
+-------+-------+-------+

此表显示第二个捐赠者(B)在这 4 个月内向我们提供了他的捐赠

现在我想创建一个 sql 语句,将Donors 表Donation_Months 表关联起来,并像上表一样显示结果。

这里的重点是我想为每个捐赠者获取很多行,但我想在一个循环或一行中显示它们

我怎样才能做到这一点 ??我尝试了很多方法,但没有那样的意义

SELECT accounts.*, (SELECT * FROM donation_months where donation_months.domo_account_id = accounts.account_id) AS months FROM `accounts`

账户=捐助者

我想做的想法是,我想根据捐助者 id 获取第二个表的结果数组,并将其作为文本存储在 temp 列中

+-------+------------------------+
| Donor |      temp_months       |
+-------+------------------------+
|   A   |         ()             |
|   B   |  (Jan, Feb, Mar, Apr)  |
|   C   |         ()             |
|   D   |         ()             |
+-------+------------------------+

提前致谢

标签: phpmysqlsql

解决方案


一种解决方案可能是我们的条件聚合

SELECT
    d.name,
    COALESCE(MAX(m.month = 'Jan'), 0) Jan,
    COALESCE(MAX(m.month = 'Fev'), 0) Fev,
    COALESCE(MAX(m.month = 'Mar'), 0) Mar,
    COALESCE(MAX(m.month = 'Apr'), 0) Apr,
    COALESCE(MAX(m.month = 'May'), 0) May
FROM
    donors d
    CROSS JOIN (SELECT DISTINCT month FROM Donation_Months) x
    LEFT JOIN Donation_Months m ON m.do_id = d.id
GROUP BY d.name;

DB Fiddle 上的演示


根据您编辑的帖子,您可能希望GROUP_CONCAT在单个列中显示所有月份,例如:

SELECT
    d.name,
    GROUP_CONCAT(DISTINCT m.month ORDER BY m.dm_id) temp_months
FROM
    donors d
    CROSS JOIN (SELECT DISTINCT month FROM Donation_Months) x
    LEFT JOIN Donation_Months m ON m.do_id = d.id
GROUP BY d.name;

DB Fiddle 上的演示


推荐阅读