2011-08-09 16 views
10

पर निर्भर करता है जैसा कि अब मुझे पता है, CASEE केवल संदर्भ में उपयोग किया जा सकता है। हालांकि, मुझे column मान के आधार पर अलग-अलग तालिका का उपयोग करने की आवश्यकता है। मैंने जो कोशिश की है वह इस तरह दिखता है:MySQL क्वेरी जहां जॉइन 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'])} 

अब मुझे पता है कि यह अवैध वाक्यविन्यास है, निकटतम विकल्प क्या है?

+1

तुम दोनों 'pages' और' – ajreal

+1

कहाँ आपको लगता है कि मामला पढ़ा urls' केवल जहां में इस्तेमाल किया जा सकता विलय करना चाहिए खंड? यह सच नहीं है। –

+0

सचमुच "दो डेटाबेस को एक में विलय" में विलय करें? ठीक है, उस मामले में यह एक विकल्प नहीं है क्योंकि दोनों के पास पूरी तरह से अलग संरचना है। @ अलवारो जी। विकारियो: किसी भी तरह से, यह वैध वाक्यविन्यास नहीं है। इसलिए मैं एक विकल्प के लिए पूछ रहा हूँ। – 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 या जावास्क्रिप्ट के विपरीत, 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

में किया जा सकता है, यह दो बाएं जुड़ने के साथ ठीक काम करता है लेकिन जब मैं तीसरी पसंद जोड़ता हूं तो यह एक त्रुटि देता है –

+0

@YosraNagati इसमें शामिल वाक्यविन्यास में कुछ भी नहीं है जो इसे किसी दिए गए टेबल पर प्रतिबंधित करता है। त्रुटि संदेश शायद आपके कोड में एक त्रुटि के कारण है। –

1

उपयोग बाहरी दोनों टेबल पर जुड़ जाता है और अपने COUNT अंदर 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'])} 

CASE के लिए गैर-हिट एक null आईडी दे देंगे और नहीं गिना जाएगा।

नोट: टेबल a1 अपने जहां खंड में है, लेकिन एक चयनित तालिका

संबंधित मुद्दे