为什么大小写表达式不适用于 PHP 中使用的 SQL 查询连接


Why doesn't case expression work on SQL query joins used in PHP?

我有两个准备好的查询,第一个版本有效,但第二个使用 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

mp.from_type的值在msg_pv表中始终为"mb"。我完全使用了MySQL参考手册中重新注释的结构。我不明白为什么第二个查询不起作用。

如果您的 CASE 抑制值的计算结果始终为 true,则无需使用该语句。

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

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

您可以使用以下链接验证此语句:即时 SQL 格式化程序

查询

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 中可能有所不同。但是,即使在MySQL中,这里使用的左外连接的概念也是相同的。

  • 有三个表,即table1table2table3
  • 在这里,我们必须根据以下条件将表1与表2和表3连接起来。
  • 如果表 1 中的 colrefid 具有
  • t2 constant,则将表 1 中的 colrefid表 2 中的 col2 连接起来。
  • 如果表 1 中的 colrefid 具有值 t3 constant,则将表 1 中的 colrefid表 3 中的 col3 连接起来。
  • 您可以在末尾看到输出

希望这能让您有一个想法,根据您的要求加入表格。

脚本

CREATE TABLE dbo.Table1
(
        col1        INT         NOT NULL
    ,   colrefid    INT         NOT NULL
    ,   constant    VARCHAR(10) NOT NULL
);
CREATE TABLE dbo.Table2
(
        col2    INT         NOT NULL
    ,   name    VARCHAR(10) NOT NULL
);
CREATE TABLE dbo.Table3
(
        col3    INT         NOT NULL
    ,   name    VARCHAR(10) NOT NULL
);
INSERT INTO dbo.Table1 (col1, colrefid, constant) VALUES
    (123, 2, 't2'),
    (784, 3, 't3'),
    (498, 2, 't2');
INSERT INTO dbo.Table2 (col2, name) VALUES
    (2, 'table 2');
INSERT INTO dbo.Table3 (col3, name) VALUES
    (3, 'table 3');
SELECT          t1.col1
            ,   t1.colrefid
            ,   t1.constant
            ,   COALESCE(t2.col2, t3.col3) colvalue
            ,   COALESCE(t2.name, t3.name) colname
FROM            dbo.Table1  t1
LEFT OUTER JOIN dbo.Table2  t2
ON              t2.col2     = t1.colrefid
AND             t1.constant = 't2'
LEFT OUTER JOIN dbo.Table3  t3
ON              t3.col3     = t1.colrefid
AND             t1.constant = 't3';

输出

col1 colrefid constant colvalue colname
---- -------- -------- -------- -------
123      2       t2        2    table 2
784      3       t3        3    table 3
498      2       t2        2    table 2