我必须编写一个查询来形成条形图。在条形图中,x 轴应根据日期时间 (dateValue) 进行分组,y 轴应具有数字总和 (stringValue)。这两个字段都是我的 task_project_field 表中的自定义字段,该表有两个该值的条目。如何实现可以根据日期时间和数字进行分组的结果
我想按月分组。假设 2024 年 5 月,并对所有字符串值求和,假设为 (900)。这两个值都位于两个不同的 field_id(field_id 371 和 349)中,如表所示。
这是我的询问:
SELECT t.id,
CONCAT(MONTHNAME(tpf.dateValue), '-', year(tpf.dateValue)) as month,
t.task_name,
tm.project_id,
tm.team_id,
tpf.field_id,
tpf.dateValue,
tpf.stringValue
FROM task as t
inner join task_membership tm on t.id = tm.task_id
and tm.deleted_at = 0
and t.deleted_at = 0
left join task_project_field as tpf on t.id = tpf.task_id
and tpf.deleted_at = 0
WHERE (
tpf.field_id = 371
or tpf.field_id = 349
)
AND t.id in (2981641);
这是我的桌子:
期望的结果:
从您共享的 SQL 向后工程表,看起来您有一个 EAV 设计。本质上,您的
task_project_field
表中存储了多个键/值。在这种情况下field_id
/string/date_value
。
处理此问题的最佳方法是
LEFT OUTER JOIN
到您的 task_project_field
表中查找您想要抓取的每个 field_id
。否则你最终需要聚合,事情会变得丑陋。
考虑:
SELECT t.id,
CONCAT(MONTHNAME(tpf349.dateValue), '-', year(tpf349.dateValue)) as displayKey,
tpf371.stringValue as countsum
FROM task as t
inner join task_membership tm on t.id = tm.task_id
and tm.deleted_at = 0
and t.deleted_at = 0
left join task_project_field as tpf371 on t.id = tpf371.task_id
and tpf371.deleted_at = 0
and tpf371.field_id = 371
left join task_project_field as tpf349 on t.id = tpf349.task_id
and tpf349.deleted_at = 0
and tpf349.field_id = 349
在这里,我们根据我们感兴趣的
tpf
连接两次,为 field_id
别名。我们还在连接标准中包含一个新条件,以指定我们想要用于此特定连接的 field_id
。
+---------+------------+----------+
| id | displayKey | countsum |
+---------+------------+----------+
| 2981641 | April-2024 | 900 |
| 2981642 | June-2024 | 123456 |
| 2981643 | May-2024 | 8900 |
| 2981644 | June-2024 | 90 |
| 2981645 | May-2024 | 16 |
+---------+------------+----------+
此输出基于您共享的初始屏幕截图“输出”。
你可以在这个 dbfiddle 看到它的实际效果。