【发布时间】:2012-11-22 18:59:05
【问题描述】:
我有 3 个这样的表设置(有点简化):
时间跟踪:id、tr_proj_id、tr_min、tr_type
time_projects: id, project_name
time_tasks: id, task_name
基本上,我想根据 tr_type 检索 project_name 或 task_name,这可能是“项目”或“任务”的价值
一个例子
时间跟踪
+----+------------+--------+---------+
| id | tr_proj_id | tr_min | tr_type |
+----+------------+--------+---------+
| 1 | 3 | 60 | project |
| 2 | 3 | 360 | task |
| 3 | 1 | 120 | project |
| 4 | 2 | 30 | project |
| 5 | 2 | 30 | task |
| 6 | 1 | 90 | task |
+----+------------+--------+---------+
time_projects
+----+------------------------+
| id | project_name |
+----+------------------------+
| 1 | Make someone happy |
| 2 | Start a project |
| 3 | Jump out of the window |
+----+------------------------+
time_tasks
+----+---------------------+
| id | task_name |
+----+---------------------+
| 1 | drink a beer |
| 2 | drink a second beer |
| 3 | drink more |
+----+---------------------+
期望的输出
+----+------------------------+------------+--------+---------+
| id | name | tr_proj_id | tr_min | tr_type |
+----+------------------------+------------+--------+---------+
| 1 | Jump out of the window | 3 | 60 | project |
| 2 | drink more | 3 | 360 | task |
| 3 | Make someone happy | 1 | 120 | project |
| 4 | Start a project | 2 | 30 | project |
| 5 | drink a second beer | 2 | 30 | task |
| 6 | drink a beer | 1 | 90 | task |
+----+------------------------+------------+--------+---------+
在整个 JOIN 事情上真的很糟糕,这是我迄今为止唯一想到的(这不起作用..):
SELECT tt.tr_proj_id, tt.tr_type, tt.tr_min, pp.project_name, pp.id, ta.task_name, ta.id
FROM time_tracking as tt, time_projects as pp, time_tasks as ta
WHERE ((tt.tr_type = 'project' AND pp.id = tt.tr_proj_id) OR (tt.tr_type = 'task' AND ta.id = tt.tr_proj_id))
AND tt.tr_min > 0
ORDER BY tt.tr_proj_id DESC
如果有人知道如何做到这一点,请随时分享!
更新:我好像忘了指明我使用的是访问数据库。这显然不接受CASE 或coalesce 之类的东西。显然有IIF(),但我不太确定在这种情况下如何使用它。
【问题讨论】:
-
为什么这是任务?
2 | drink more | 3 | 360 | task -
所需的输出无法理解,“发送电子邮件”在哪里?
-
@HamletHakobyan 我的错,你是对的,我编辑以更正输出
-
更新了我的问题,忘了说我在这种情况下使用的是访问数据库