首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个表上的sql排序相同的列名

两个表上的sql排序相同的列名
EN

Stack Overflow用户
提问于 2016-01-19 10:12:16
回答 2查看 50关注 0票数 1

我有两张桌子:

  1. projects_tasks
  2. projects_tasks_deadlines

现在,我有一个简单的查询,在它们的最后期限对每个任务进行排序。一开始,任务只能有一个截止日期。

然后,我被要求能够为一项任务设定多个截止日期。这就是为什么我有第二个表projects_tasks_deadlines

我设法允许用户选择应该激活的截止日期(任务细节)。但是在包含所有任务的列表中,如果至少可以的话,我不知道如何在两个表之间排序。

这是我目前使用的查询:

代码语言:javascript
复制
SELECT 
    projects_tasks.id AS task_id,
    projects_tasks.name AS task_name,
    projects_tasks.deadline AS task_deadline,
    projects_tasks.created_by AS task_creator,
    labels.name AS task_label,
    users.name AS task_responsible_name,
    users.surname AS task_responsible_surname,
    users2.name AS task_assigner_name,
    users2.surname AS task_assigner_surname
FROM `projects_tasks`
    INNER JOIN `labels` ON labels.id = projects_tasks.label_id
    INNER JOIN `users` ON users.id = projects_tasks.responsible_id
    INNER JOIN `users` AS `users2` ON users2.id = projects_tasks.created_by
WHERE projects_tasks.project_id = :project_id
AND labels.id != '8'
ORDER BY -projects_tasks.deadline DESC

如何实现我的目标,检查第二个表中是否有活动的截止日期,以及相应的`task_id。如果找到了火柴,就把最后期限算进去,然后分类。

举个例子:

表projects_tasks:

代码语言:javascript
复制
id | name | deadline
--------------------
1  | test | 2016-01-19
2  | test2| 2016-02-15
3  | test | 2016-01-25

表projects_tasks_deadlines

代码语言:javascript
复制
id | task_id | deadline  | active
--------------------------------
1  | 1       | 2016-01-20| 1 // yes
2  | 1       | 2016-01-24| 0 // no
3  | 2       | 2016-02-25| 0

结果应该是

  1. 2016-01-20 -> projects_tasks_deadlines
  2. 2016-01-25 -> projects_tasks
  3. 2016-02-15 -> projects_tasks

谢谢你的帮助,希望这足够清楚..。

**更新**

代码语言:javascript
复制
SELECT 
    projects_tasks.id AS task_id,
    projects_tasks.name AS task_name,
    projects_tasks.created_by AS task_creator,
    projects_tasks_deadlines.id AS deadline_id,
    labels.name AS task_label,
    users.name AS task_responsible_name,
    users.surname AS task_responsible_surname,
    users2.name AS task_assigner_name,
    users2.surname AS task_assigner_surname,
    CASE WHEN projects_tasks_deadlines.deadline_active = '1' THEN projects_tasks_deadlines.deadline AS task_deadline ELSE
    projects_tasks.deadline AS task_deadline END
FROM `projects_tasks`
    INNER JOIN `labels` ON labels.id = projects_tasks.label_id
    INNER JOIN `users` ON users.id = projects_tasks.responsible_id
    INNER JOIN `users` AS `users2` ON users2.id = projects_tasks.created_by
    LEFT JOIN projects_tasks_deadlines ON projects_tasks_deadlines.task_id = projects_tasks.id
WHERE projects_tasks.project_id = '1'
AND labels.id != '8'
ORDER BY CASE WHEN projects_tasks_deadlines.deadline_active = 1 THEN -projects_tasks_deadlines.deadline ELSE -projects_tasks.deadline END DESC

我应该如何在CASE中做SELECT

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-19 10:34:10

你可以按条件订购。如果active =1,则使用projects_tasks_deadline表中的截止日期,否则使用projects_tasks表。所以就像这样:

代码语言:javascript
复制
SELECT 
    projects_tasks.id AS task_id,
    projects_tasks.name AS task_name,
    projects_tasks.deadline AS task_deadline,
    projects_tasks.created_by AS task_creator,
    labels.name AS task_label,
    users.name AS task_responsible_name,
    users.surname AS task_responsible_surname,
    users2.name AS task_assigner_name,
    users2.surname AS task_assigner_surname
FROM `projects_tasks` 
    INNER JOIN `labels` ON labels.id = projects_tasks.label_id
    INNER JOIN `users` ON users.id = projects_tasks.responsible_id
    INNER JOIN `users` AS `users2` ON users2.id = projects_tasks.created_by
LEFT JOIN projects_tasks_deadline ptd ON id = task_id
WHERE projects_tasks.project_id = :project_id
AND labels.id != '8'
ORDER BY CASE WHEN ptd.active = 1 THEN ptd.deadline ELSE projects_tasks.deadline END DESC

希望这有意义吗?

票数 2
EN

Stack Overflow用户

发布于 2016-01-19 11:51:16

我终于找到了解决办法:

代码语言:javascript
复制
SELECT 
    projects_tasks.id AS task_id,
    projects_tasks.name AS task_name,
    projects_tasks.created_by AS task_creator,
    labels.name AS task_label,
    users.name AS task_responsible_name,
    users.surname AS task_responsible_surname,
    users2.name AS task_assigner_name,
    users2.surname AS task_assigner_surname,
    (CASE WHEN projects_tasks_deadlines.deadline_active = '1' THEN projects_tasks_deadlines.deadline ELSE projects_tasks.deadline END) AS task_deadline
FROM projects_tasks
    INNER JOIN `labels` ON labels.id = projects_tasks.label_id
    INNER JOIN `users` ON users.id = projects_tasks.responsible_id
    INNER JOIN `users` AS `users2` ON users2.id = projects_tasks.created_by
    LEFT JOIN projects_tasks_deadlines ON projects_tasks_deadlines.task_id = projects_tasks.id
WHERE projects_tasks.project_id = '1'
AND labels.id != '8'
GROUP BY projects_tasks.id
ORDER BY CASE WHEN projects_tasks_deadlines.deadline_active = '1' THEN -projects_tasks_deadlines.deadline ELSE -projects_tasks.deadline END DESC

我错过了另一个CASESELECT

代码语言:javascript
复制
(CASE WHEN projects_tasks_deadlines.deadline_active = '1' THEN projects_tasks_deadlines.deadline ELSE projects_tasks.deadline END) AS task_deadline

这过滤出了正确的截止日期,他们也在正确的最后期限上得到了分类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34873985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档