2011-08-09 9 views
10

私が今認識しているように、CASEはWHEREコンテキストでのみ使用できます。しかし、私はcolumn値に応じて別のテーブルを使用する必要があります。私が試したことは、次のようになります:JOINがCASEに依存するMySQLクエリ

SELECT 
    `ft1`.`task`, 
    COUNT(`ft1`.`id`) `count` 
FROM 
    `feed_tasks` `ft1` 
CASE 
    `ft1`.`type` 
WHEN 
    1 
THEN 
    (INNER JOIN `pages` `p1` ON `p1`.`id` = `ft1`.`reference_id`) 
WHEN 
    2 
THEN 
    (INNER JOIN `urls` `u1` ON `u1`.`id` = `ft1`.`reference_id`) 
WHERE 
    `ft1`.`account_id` IS NOT NULL AND 
    `a1`.`user_id` = {$db->quote($user['id'])} 

これは無効な構文であることが分かりましたので、最も近い選択肢は何ですか?

+1

あなたは両方 'pages'と'あなたがそのような場合を読みました – ajreal

+1

urls'のみWHEREで使用することができますをマージする必要があります節?それは真実ではありません。文字通り「2つのデータベースを1つにマージする」のようにマージしますか? –

+0

まあ、その場合は、どちらも完全に異なる構造を持っているので、これはオプションではありません。 @ÁlvaroG. Vicario:いずれにせよ、これは有効な構文ではありません。したがって、私は代替案を求めています。 – Gajus

答えて

11

ではないようです。

SELECT ft1.task, COUNT(ft1.id) AS count 
FROM feed_tasks ft1 
LEFT JOIN pages p1 ON ft1.type=1 AND p1.id = ft1.reference_id 
LEFT JOIN urls u1 ON ft1.type=2 AND u1.id = ft1.reference_id 
WHERE COALESCE(p1.id, u1.id) IS NOT NULL 
AND ft1.account_id IS NOT NULL 
AND a1.user_id = :user_id 

編集:

少しノートについてCASE...END。 PHPまたはJavaScriptとは異なり、SQL CASEは、コードのどの部分を実行するかを選択できるフロー制御構造ではないため、元のコードは実行されません。代わりに、式を返します。

SELECT CASE 
    WHEN foo<0 THEN 'Yes' 
    ELSE 'No' 
END AS is_negative 
FROM bar 

を...ではなく、この:だから、これを行うことができます

-- Invalid 
CASE 
    WHEN foo<0 THEN SELECT 'Yes' AS is_negative 
    ELSE SELECT 'No' AS is_negative 
END 
FROM bar 
+0

2つの左ジョインでうまく動作しますが、3番目の選択肢を追加するとエラーが返されます –

+0

@YosraNagatiジョイン構文には指定された数のテーブルに制限するものはありません。エラーメッセージは、おそらくコードのエラーが原因です。 –

1

利用外側には、両方のテーブルに参加し、あなたのCOUNTCASEを移動:CASEため

SELECT 
    ft1.task, 
    COUNT(case ft1.id when 1 then p1.id when 3 then u1.id end) as count 
FROM feed_tasks ft1 
LEFT JOIN pages p1 ON p1.id = ft1.reference_id 
LEFT JOIN urls u1 ON u1.id = ft1.reference_id 
WHERE ft1.account_id IS NOT NULL 
AND a1.user_id = {$db->quote($user['id'])} 

非ヒットをnull IDを与えるとカウントされません。

注:表a1は、あなたのwhere句であるが、それはおそらく正しい結果を返すように微調整する必要がありますが、私はあなたのアイデアを得る願って、選択したテーブル