2009-12-08 6 views
11

से मैं MySQL में एक प्रश्न है सबक्वेरी:सिद्धांत - में

SELECT * FROM (
    SELECT COUNT(*) AS count, t.name AS name 
    FROM tag t 
    INNER JOIN video_has_tag v USING (idTag) 
    GROUP BY v.idTag 
    ORDER BY count DESC 
    LIMIT 10 
) as tags ORDER BY name 

और मैं सिद्धांत में यह लिखना चाहते हैं। मैं यह कैसे कर सकता हूँ? मैं ने लिखा है:

Doctrine_Query::create() 
     ->select('COUNT(t.idtag) as count, t.name') 
     ->from('Tag t') 
     ->innerJoin('t.VideoHasTag v') 
     ->groupBy('v.idTag') 
     ->orderBy('count DESC, t.name') 
     ->limit(30) 
     ->execute(); 

लेकिन मैं नहीं नाम से सॉर्ट करने के लिए "से" में रख सकते हैं।

+0

आपका क्या मतलब है: 'इसे नाम से क्रमबद्ध करें' से 'इसमें डाल दें'? –

+0

सिद्धांत समर्थन subquery करता है? हो सकता है कि पूरी क्वेरी को (...) – Yada

+0

@ क्रिस विलियम्स: mysql क्वेरी पर देखें :) @Yada: जब मैंने पूरी क्वेरी को अंदर से रखा है() सिद्धांत मुझे बताता है कि "(चयन करें" तालिका मौजूद नहीं है – snapshot

उत्तर

9

यह एक जवाब है। आप मॉडल के लिए addComponent कर सकते हैं।

कुछ लायक उल्लेख है कि आप सीधे Doctrine_Query वस्तुओं उपयोग कर सकते हैं नहीं सबक्वेरी के रूप में लेकिन आप आसानी से या यहाँ तक कि getSqlQueryPartgetSqlQuery() विधि के माध्यम से एसक्यूएल प्रपत्र प्राप्त कर सकते हैं और सबक्वेरी के लिए परिणाम का उपयोग है ।

getSqlQueryPart किसी क्वेरी के केवल कुछ हिस्सों के पुनर्निर्माण में उपयोगी है।

1

सिद्धांत FROM खंड में एक सबक्वायरी नहीं कर सकता है (न ही यह सबक्वायरी में शामिल हो सकता है)। आपकी वर्तमान सिद्धांत क्वेरी गिनती और फिर नाम से क्रमबद्ध करने जा रही है। क्या वह नहीं है जो आप चाहते हैं?

+0

अब यह तरह से गिनती है और जब एक ही मूल्य इसे तरह नाम से है मैं standart टैग क्लाउड प्राप्त करना चाहते हैं: सबसे बड़ी गिनती नाम – snapshot

0

सिद्धांत आपको FROM खंड में एक सबक्वायरी डालने देगा। हालांकि, यह केवल subquery में डीक्यूएल पाठ विवरण ले सकता है, आप वास्तव में किसी अन्य क्वेरी ऑब्जेक्ट का उपयोग नहीं कर सकते हैं। यदि आप अपने डीक्यूएल सबक्वायरी को पाठ के रूप में फिर से लिखते हैं, तो आप इसका उपयोग करने में सक्षम होना चाहिए।

उदाहरण के लिए this page of the documentation देखें। उदाहरण WHERE खंड में DQL सबक्वायरी डालता है, लेकिन यह उल्लेख करता है कि आप FROM खंड में उपक्विरी का उपयोग कर सकते हैं।

$q = new Doctrine_RawSql(); 
$q->addComponent('t', 'Tag') 
    ->select('{t.name}, {t.count}') 
    ->from('(SELECT COUNT(*) as count, t.name,t.idtag 
     FROM Tag t 
      INNER JOIN Video_Has_Tag v USING(idTag) 
     GROUP BY v.idTag 
     ORDER BY count DESC 
     LIMIT 50) t') 
    ->orderBy('name'); 
+0

मैंने लिखा अनुसार क्रमबद्ध साथ 10 टैग: $ टैग = Doctrine_Query :: (बनाने) - से>। ('(COUNT का चयन करें (*) गिनती, t.name टैग से टी के रूप में आंतरिक द्वारा v.idTag में शामिल होने t.VideoHasTag वी ग्रुप द्वारा गिनती DESC सीमा 30) टैग के रूप में') -> orderBy ('नाम') - > पर अमल(); और मैं "वर्ग नहीं मिल सका (चयन" – snapshot

+2

सिद्धांत करता है * नहीं * समर्थन में FROM खंड उप प्रश्नों, डॉक्स क्या कहते हैं के बावजूद: http://groups.google। com/समूह/सिद्धांत-उपयोगकर्ता/browse_thread/धागा/7572bf091e822b1f/d72952f5aa1378ee – EvanK

2

मैं सबक्वेरी साथ सिद्धांत 1.2 और Symfony 1.4 और Doctrine_RawSql काम करता है का उपयोग करें:

+0

हैं Doctrine_RawSql जैसी कोई चीज नहीं() –