SQL没有做我需要的事情

时间:2017-09-12 10:07:58

标签: mysql sql

我在此查询中遇到第二次加入问题。用户可以更改任务的顺序,这不会影响其他用户的排序。但是,如果没有为用户设置任何订单,则不会为他显示任务,因为第二次连接不会返回结果,尽管它被留在外部连接

select  `workflow_tasks`.*, 
        `workflow_task_order`.`order`, 
        `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
        `workflow_group_tasks`.`task_id` as `pivot_task_id`
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on `workflow_tasks`.`id` = `workflow_task_order`.`task_id`
where (`workflow_task_order`.`user_id` = 1 
        or `workflow_task_order`.`user_id` is null) 
and `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc

2 个答案:

答案 0 :(得分:0)

我想当你想要获取特定用户的任务时,你应该在workflow_task_order以外的表中应用用户过滤器。如果这是您此时唯一的用户(我认为是真的),那么您的查询将不会返回任何结果。这是因为正如你所说,你没有"命令"该用户的记录,并且您显然没有任何条目用于null id的用户。

我想您user_id中也有workflow_tasks列,然后以下查询应该可以正常运行并产生您期望的结果:

select  `workflow_tasks`.*, 
        `workflow_task_order`.`order`, 
        `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
        `workflow_group_tasks`.`task_id` as `pivot_task_id`
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on `workflow_tasks`.`id` = `workflow_task_order`.`task_id`
where `workflow_tasks`.`user_id` = 1  
and `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc

但是,如果您有针对不同用户(例如团队)的常见任务,并且您在user_id之外的任何其他表格中没有workflow_task_order,则以下查询应该更合适:

select  `workflow_tasks`.*, 
        `workflow_task_order`.`order`, 
        `workflow_group_tasks`.`group_id` as `pivot_group_id`, 
        `workflow_group_tasks`.`task_id` as `pivot_task_id`
from `workflow_tasks` 
    inner join `workflow_group_tasks` on `workflow_tasks`.`id` = `workflow_group_tasks`.`task_id` 
    left outer join `workflow_task_order` on (`workflow_tasks`.`id` = `workflow_task_order`.`task_id` and `workflow_task_order`.`user_id` = 1)
where `workflow_group_tasks`.`group_id` in (1, 2, 3, 7) 
group by `workflow_tasks`.`id` 
order by `order` asc

答案 1 :(得分:0)

您的问题是on子句。但是对于表别名,您的查询将更具可读性:

select  wt.*, wto.`order`, wgt.group_id as pivot_group_id, 
        wgt.task_id as pivot_task_id
from workflow_tasks wt inner join 
     workflow_group_tasks wgt
     on wt.id = wgt.task_id left join
     workflow_task_order wto
     on wt.id = wto.task_id and wto.user_id = 1
where wgt.group_id in (1, 2, 3, 7) 
group by wt.id
order by `order` asc;

假设行确实匹配,当其他用户的任务订单而不是1时,您的版本不起作用。然后where过滤掉所有行。

让我提一下其他一些事情:

  • 表别名使查询更容易阅读。
  • group by非常可疑,因为select中没有聚合函数。我怀疑你在做什么。
  • order是一个非常糟糕的列名,因为它是一个SQL关键字。