为什么case表达式不适用于PHP中使用的SQL查询连接?

时间:2012-04-28 15:02:47

标签: php mysql sql phpmyadmin

我有一个准备好的查询有两个版本,第一个有效但第二个使用CASE WHEN则没有:

 SELECT  mFrom.user_name AS sender_name, mp.message AS message
 FROM msg_pv mp
 INNER JOIN membresmvc AS mFrom 
    ON mp.id_from = mFrom.id
 WHERE mp.id_to = :id_member

案例版本:

 SELECT  mFrom.user_name AS sender_name, mp.message AS message
 FROM msg_pv mp
 INNER JOIN 
    CASE mp.from_type
        WHEN "mb" THEN membresmvc AS mFrom ON mFrom.id = mp.id_from 
    END -- also tried "END CASE"    
 WHERE mp.id_to = :id_member

msg_pv表中mp.from_type的值始终为“mb”。我完全使用the structure recommented in the MySQL reference manual。我不明白为什么第二个查询不起作用。

1 个答案:

答案 0 :(得分:2)

如果您的 CASE 表达式值始终评估为true,则无需使用该语句。

但是,我认为在您的查询中使用 CASE 是错误的。它应该如下所示。您可以在ON 条件上使用 CASE ,但不能在 JOIN 本身上。这样,您可以根据条件加入不同的列。

这在语法上是正确的,但不确定输出是什么。

您可以使用以下链接验证此声明:Instant SQL Formatter

查询

SELECT      mFrom.user_name AS sender_name, 
            mp.message      AS message 
FROM        msg_pv mp 
INNER JOIN  membresmvc 
ON          ( 
                CASE mp.from_type 
                    WHEN "mb" THEN mFrom.id = mp.id_from 
                    ELSE NULL 
                END 
            ) 
WHERE  mp.id_to = :id_member;

更新

如果您需要根据条件加入多个表,则需要使用LEFT OUTER JOIN。假设您的第二个表是* second_table *而另一个值是“另一个值”

,您的查询可能看起来像这样
SELECT          COALESCE(mFrom.user_name, second_table.some_col) AS sender_name, 
                mp.message      AS message 
FROM            msg_pv mp 
LEFT OUTER JOIN membresmvc 
ON              mFrom.id        = mp.id_from 
AND             mp.from_type    = "mb"
LEFT OUTER JOIN second_table 
ON              second_table.id = mp.id_from 
AND             mp.from_type    = "another value"
WHERE           mp.id_to = :id_member;

实施例

这是一个说明它的例子。此脚本在SQL Server 2012数据库中进行了测试。它在MySQL中可能有所不同。但是,这里使用的LEFT OUTER JOIN的概念在MySQL中也是一样的。

  • 有三个表格table1table2table3
  • 这里我们必须根据以下条件将table1与table2和table3连接起来。
  • 如果{{1>将 table1 中的 colrefid table2 中的 col2 一起加入 table1 中的值 t2
  • table3 中的 colrefid table3 中的 col3 ,如果{{1> } table1 中的值 t3
  • 您可以在最后看到输出

希望能让您根据自己的要求加入表格。

脚本

constant

输出

constant