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