mysql case子句中的子查询

时间:2014-10-28 21:23:16

标签: mysql select

以下查询在oracle中有效,但在mysql中会产生错误:

SELECT id_propuestas, titulo, descripcion, id_usuario, votos,
case 
    when(select true 
        from votospropuestos
        where id_propuesta = propuestas.id_propuesta
        and id_usuario = 1) then true 
    else false 
end as votada 
FROM propuestas            

错误讯息:

  

错误代码:1054。'propuestas.id_propuesta'

中的未知列'where clause'

任何人都可以解释问题和/或提出解决方案吗?

2 个答案:

答案 0 :(得分:1)

根据SQL ANSI 1999,这是标准中CASE WHEN语句的首次出现,您无法使用子查询。

答案 1 :(得分:0)

您不能将子查询放在case中,但可以使用exists()函数轻松地重新设计查询以实现您的意图:

SELECT id_propuestas, titulo, descripcion, id_usuario, votos,
exists(select *
     from votospropuestos 
     where id_propuesta = propuestas.id_propuesta
     and id_usuario = 1) as votada 
FROM propuestas            

如果从子查询返回任何行,exists()函数将返回true,否则返回false

使用连接会更有效率:

SELECT p.id_propuestas, p.titulo, p.descripcion, p.id_usuario, p.votos,
    max(v.id_propuesta) IS NOT NULL as votada
FROM propuestas p
LEFT JOIN votospropuestos v
    ON v.id_propuesta = p.id_propuesta
    AND v.id_usuario = 1
GROUP BY 1, 2, 3, 4, 5