4

JOIN'Links'テーブルへのクエリで返される結果に、行ごとの'toTable'の値を条件として選択された'DisplayName'値を示す列も追加します。さらに、その'DisplayName'値は、列の連結の結果である場合があります。

私の質問は、どうすればこれを行うことができますか?

UNION ALL条件付きの方法があるのだろうかと思いますが、個別のクエリを記述して組み合わせることができます

「リンク」テーブルの各エントリは、2つのテーブル(3つ以上のテーブルの可能性がある)のエントリのペア間のリンクを記述します。

リンクテーブル:

| LinkID | fromTable | fromID | toTable | toID |
|      1 |        A  |      1 |      B  |    1 |
|      2 |        A  |      1 |      C  |    2 |
|      3 |        B  |      1 |      C  |    1 |
|      4 |        C  |      1 |      A  |    1 |

必要なクエリ結果: WHERE Links.fromTable ='A' OR Links.fromTable='C'たとえば

| LinkID | fromTable | fromID | toTable | toID | DisplayName      |
|      1 |        A  |      1 |      B  |    1 |  Some Title      |
|      2 |        A  |      1 |      C  |    2 |  Loud-Quack      |
|      4 |        C  |      1 |      A  |    1 |  Linus           |

異なる列を持つ3つのテーブル:

Table A:    
| ID  | Name  |
| 1   | Linus |

-

Table B:    
| ID  | Title      |
|  1  | some title |

-

Table C:    
| ID  | CategoryA | CategoryB |
| 1   |   Bark    |    Softly |
| 2   |   Quack   |    Loud   |

-これは私がこれを行う方法ですUNION ALLが、あまり柔軟ではありません:編集:実際には、以下が間違っていると思います、私は今これを見ています:

SELECT Links.*, A.Name AS DisplayName
FROM Links 
JOIN A ON Links.toID = A.ID 
WHERE Links.fromType IN ('A') AND Links.toType IN ('B')

UNION ALL

SELECT Links.*, CONCAT(C.CategoryB,'-',C.CategoryA) AS DisplayName
FROM Links 
JOIN C ON Links.toID = C.ID 
WHERE Links.fromType IN ('A') AND Links.toType IN ('C')
4

2 に答える 2

5

私はあなたがinline CASEステートメントを必要としています

SELECT  a.*,
        CASE toTable
            WHEN 'A' THEN b.Name
            WHEN 'B' THEN c.Title
            WHEN 'C' THEN CONCAT(d.CategoryB , '-',d.CategoryA )
        END AS DisplayName
FROM    `links` a
            LEFT JOIN tableA b
                ON a.toID = b.ID
            LEFT JOIN tableB c
                ON a.toID = c.ID
            LEFT JOIN tableC d
                ON a.toID = d.ID
WHERE   fromtable IN ('A', 'C')

SQLFiddleデモ

于 2012-09-03T00:55:33.327 に答える
1

さて、あなたのサンプルクエリでは、代わりにこれを行うことができます:

SELECT Links.*, COALESCE(A.Name,CONCAT(C.CategoryB,'-',C.CategoryA)) AS DisplayName
FROM Links 
LEFT OUTER JOIN A ON Links.toID = A.ID 
    AND Links.fromType IN ('A') AND Links.toType IN ('B')
LEFT OUTER JOIN C ON Links.toID = C.ID 
    AND Links.fromType IN ('A') AND Links.toType IN ('C')

これは、結合されたテーブルから常に最大で1つの一致を取得する限り機能します(つまり、同じ基準を持つ2つの異なる結合がない場合)。Links.fromType IN ...Links.toType IN ...

于 2012-09-03T00:52:36.240 に答える