繁体   English   中英

如何正确编写此 SQL 查询?

[英]How can I write this SQL query correctly?

我试图弄清楚如何编写查询以获得正确的结果。

我会保持简单。 一、基础:

我有两个表: DEALSTASKS
一个 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.

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