[英]How can I write this SQL query correctly?
我试图弄清楚如何编写查询以获得正确的结果。
我会保持简单。 一、基础:
我有两个表: DEALS
和TASKS
一个 Deal 里面可以有 1 个或多个 Task,所以TASKS
有一个deal_id
字段。
此外,每个任务都有一个time_start
字段(unix 时间戳)和一个completed
字段(1 或 0)。
好的。 现在,我需要什么? 在我看来,我需要显示与呈现的“下一个任务”列的所有交易。
所以对于每笔交易,如果我有一个任务(一个或多个),它必须只显示最接近的。 如果没有任务,我会发出警报。
Deal Title | Value | Next step
deal 1 | 1.000 | tomorrow at 11:00
deal 2 | 1.000 | NO TASK IN THIS DEAL
deal 3 | 1.500 | 12/03/2017 at 9:00
在这个例子中,deal 1 里面有 3 个任务,但是最近的明天开始。 我不希望“交易 1”重复 3 次。 <-- GROUP BY deals.id
??
为了做到这一点,目前,我在没有 JOIN 的情况下运行交易查询,并且我正在使用自定义 PDO 类为每一行的任务运行新查询。 但这很糟糕! 我对DEALS
表的每一行都有一个新查询。
我很确定有一种方法可以编写一个查询来获得此结果。
PS:不关心文字的渲染,我用“tomorrow”只是为了写例子, next_spet
是来自db的unix时间戳......我可以很容易地使用moment.js
来正确格式化它。
编辑:我将提供 2 个表中的数据,只是为了完成示例。
DEALS
ID | TITLE | VALUE
1 | Deal 1 | 1000
2 | Deal 2 | 1000
3 | Deal 3 | 1000
TASKS
ID | DEAL_ID | TITLE | TIME_START | COMPLETED
1 | 1 | Send Proposal | 1483678800 | 0
2 | 1 | Follow up | 1483441200 | 0
3 | 1 | Ask for referrals | 1484441200 | 0
4 | 2 | Send email | 1483678900 | 0
5 | 3 | Sort out meeting | 1483678900 | 0
注意:时间戳与我在第一个表中写入的结果不匹配。 它们只是一个例子,我采用time_start
字段的时间戳并将其格式化为人类可读的模式,但这不是我的问题。
如果你想要下一个任务的时间,你可以使用相关子查询:
select d.*,
(select t.time_start
from tasks t
where t.deal_id = d.deal_id and t.time_start > d.time_col
order by t.time_start
limit 1
) as task_time_start
from deals d;
编辑:
如果你想要未来,那么只需更改时间比较:
select d.*,
(select t.time_start
from tasks t
where t.deal_id = d.deal_id and t.completed = 0 and
t.time_start > now()
order by t.time_start
limit 1
) as task_time_start
from deals d;
像这样的事情应该这样做。
select
d.title as 'Deal Title',
d.value as 'Value',
IsNull(CONVERT(VARCHAR(50), min(t.time_start)), 'NO TASK IN THIS DEAL') as 'Next step'
from Deals d
left join Tasks t
on t.deal_id = d.deal_id
and t.is_completed = 0
and t.time_start > GetDate()
group by d.deal_id, d.title, d.value
这是 SQLite 的等价物:
select
d.title as 'Deal Title',
d.value as 'Value',
IfNull(min(t.time_start), 'NO TASK IN THIS DEAL') as 'Next step'
from Deals d
left join Tasks t
on t.deal_id = d.deal_id
and t.is_completed = 0
and t.time_start > now() --remove this line to include past Tasks
group by d.deal_id, d.title, d.value
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.