2016-07-28 57 views
-2

我需要创建一个查询,该查询将显示具有最低但最接近的id的项目名称,该项目也被视为“关键”项目,具体取决于任务代码是空的。这似乎是一个有点令人费解,所以我把它放在一个简单的代码来简化:如何使用ifnull创建临时表

ifnull (Task_Code, 

create Key_temp 

select id_temp 
    task_is_key_temp 
    task_id_temp 
    proj_name_temp 

from projetos_main pm left join pcrs 
ON pcrs.num_doc = pm.Task_code 

where task_id_temp <= task_id and 
task_is_sum_temp = 'true' 

order by id desc 
limit 1 

所以,当任务代码为空,我想创建一个临时表,从信息填充它我主表,并得到一个既是“重点项目”,又有低于原始标识的结果。

的问题是,我不知道是否有可能创建一个使用“IFNULL”临时表,当我做到以下几点:

ifnull(Task_code, 
     CREATE TABLE Key_temp ...) 

我得到一个语法错误。所以这是不可能的或者是我的代码错了?

编辑

这里的表结构:

Pcrs 
Num_doc| 
1  | 
2  | 
-  | 



Projetos_main 
Id || Task_is_key || Task_id || Proj_name || Task_code | 
1 || False || 3 || Name 1 ||  1  | 
2 || True  || 5 || Name 2 ||  2  | 
3 || False || 5 || Name 3 ||  -  | 

Task_code是一个外键引用Num_doc。不是所有的项目都有一个Task_Code,所以当发生这种情况时,我需要显示项目名称与最近的ID,这也是一个关键项目。

因此,它应该停止在项目3,意识到Task_code是空的,并获得项目2,它具有相同的task_id AND是一个key_task。

+0

将您所需要的临时表? –

+0

这个逻辑有点复杂,但如果绝对必要的话,我可以把它包含在问题中。我是不是该? – RazorFinger

+0

我基本上需要在同一张表上包含来自不同行和列的信息 – RazorFinger

回答

1

现在,我可以看到你的结构,我想试试这个:

SELECT pm.* 
    , IFNULL(
     pm.Task_code, 
     SELECT Task_id -- or perhaps just id? 
     FROM Projetos_main pm2 
     WHERE pm2.id < pm.id 
     ORDER BY pm2.id DESC LIMIT 1 
     ) 
FROM Projetos_main pm 
+0

这正是我需要的,非常感谢您的耐心。 – RazorFinger

+1

不客气:)请注意,如果由于子查询而存在许多行,则此操作可能会缓慢运行。 –

1

IFNULL根据列的空值的可变性返回两个参数之一。

Create table Temp select ... 

上面的代码不是有效的返回值。此查询不起作用。