2011-08-09 29 views
10

Şu anda bildiğim gibi, CASE yalnızca WHERE bağlamında kullanılabilir. Yine de, column değerine bağlı olarak farklı tablo kullanmam gerekiyor. Ne ben denedim şuna benzer:MySQL sorgusu JOIN'in bağımlı olduğu durum CASE

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'])} 

Şimdi en yakın alternatif nedir, bu geçersiz sözdizimi biliyoruz?

+1

hem 'pages' ve' O VAKA okudun – ajreal

+1

urls' sadece NEREDE kullanılabilir birleştirme gerektiğini maddeleri? Bu doğru değil. –

+0

, kelimenin tam anlamıyla "iki veritabanını bire birleştir" olarak birleştiriliyor mu? iyi, bu durumda bu bir seçenek değil çünkü ikisi de tamamen farklı bir yapıya sahipler. @ Álvaro G. Vicario: Her iki şekilde de, bu geçerli bir sözdizimi değil. Bu yüzden bir alternatif rica ediyorum. – Gajus

cevap

11

seçilmiş bir tablo olarak görünmüyor ama anladınız umut:

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 

Düzenleme:

biraz not yaklaşık CASE...END. Orijinal kodunuz, PHP veya JavaScript'in aksine, SQL CASE kodun hangi bölümünün çalışacağını seçmesine izin veren bir akış denetimi yapısı olmadığından çalışmaz. Bunun yerine, bir ifade döndürür.

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

... ama bu: Yani bunu yapabilirsiniz

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

maddelerinde kullanılabilir ve iki sol birleşmeyle birlikte iyi çalışır, ancak üçüncü bir seçenek eklediğimde bir hata döndürür –

+0

@YosraNagati Belirli bir sayıda tabloya kısıtlayan birleştirme sözdiziminde hiçbir şey yoktur. Hata mesajı, muhtemelen kodunuzdaki bir hatadan kaynaklanmaktadır. –

1

Kullanım dış hem tabloları katılır ve sizin COUNTCASE taşıyın: CASE için

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'])} 

Olmayan hit bir null kimliği verecek ve sayılmayacaktır.

Not: Tablo a1 sizin nerede fıkrada olmakla Muhtemelen doğru sonuçları döndürmek için verdiği ihtiyacı