2012-04-28 6 views
0

私は2つのバージョン、最初のものは動作しますが、2番目使っCASEないので準備されたクエリがあります。mp.from_typeのPHPで使用されるSQLクエリ結合でcase式が機能しないのはなぜですか?

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 

値である:バージョンが

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 

CASEを常にmsg_pvテーブルで "mb"を指定します。私は正確にthe structure recommented in the MySQL reference manualを使用します。なぜ2番目のクエリが機能しないのか分かりません。

+0

(私はSQLには専門家です)。また、そのケースにマッチしないときに何が起こると思いますか? – Mat

+0

このケースは常に一致します。mp.from_typeの値は常にテーブル内で "mb"ですが、なぜ動作しないのか分かりません。 SQLでCASE WHENが機能するかどうかを確認したい。 – Anon

+0

使い方に同意して、http://www.mysqldiary.com/conditional-joins-in-mysql/をチェックしてください。 – GDP

答えて

2

ケース espressionの値が常にtrueに評価されている場合、そのステートメントを持つ必要はありません。

しかし、私はケースの使用方法は間違っていると思います。それは以下のようなものでなければなりません。 ON の条件ケースを含めることはできますが、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; 

UPDATE

あなたは条件に基づいて複数のテーブルを結合するために必要がある場合は、あなたが必要としますLEFT OUTER JOINを使用します。あなたのクエリは、2番目のテーブルには、* 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でも同じです。

  • あり、3つのテーブル、すなわちtable1table2table3
  • ここでは、以下の条件に基づいて、表2と表3の両方でTABLE1に参加する必要があります。
  • に参加constant場合表2COL2TABLE1をcolrefid TABLE1T2を有しています。
  • に参加しconstant場合表3COL3TABLE1をcolrefid TABLE1T3を持っています。
  • あなたは最後にあなたの要件に応じてテーブルを結合するためのアイデアを提供します

希望の出力を見ることができます。

スクリプト

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 

+0

実際には、mp.from_typeの値に応じて別のテーブルに結合する必要があります。したがって、結合するテーブルはCASE WHEN構造体の中になければなりません!あなたのコードを適応させることはできますか? – Anon

+0

デュード、私はあなたが大好きです。どうもありがとう。 – Anon

関連する問題