DQL

2011-06-13 12 views
6

में शामिल हों और गिनें मेरे पास एक MySQL कमांड है और मुझे DQL में समतुल्य नहीं मिल रहा है। मैं सबसे अधिक टिप्पणी पोस्ट सूची लाने की कोशिश कर रहा हूँ।DQL

SELECT posts.id, COUNT(comments.id) AS num 
FROM posts 
LEFT JOIN comments ON (posts.id = comments.post_id) 
GROUP BY posts.id 

यहाँ परिणाम है:: यहाँ MySQL आदेश है

id num 
1 8 
2 9 
3 17 
4 7 
5 6 
6 20 
7 7 
8 10 
9 14 
10 7 

DQL में, यह होना चाहिए:

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post.id 

लेकिन इस देता है:

id num 
1 50 
2 0 
3 0 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 
10 0 

मुझे समझ में नहीं आता कि 50 कहां से आता है 2 परिणामों के बीच एक अंतर क्यों है। क्या आप मुझे बता सकते हैं कि इसे सिद्धांत में कैसे काम करना है?

+0

सटीक सिद्धांत द्वारा उत्पन्न जिज्ञासा क्या है? आप आसानी से सिम्फनी के डब्लूडीटी का उपयोग करके इसे देख सकते हैं। साथ ही आपको 'पोस्ट' तालिका में टिप्पणियों की कुल संख्या को स्टोर करना चाहिए और जब भी आप कोई टिप्पणी जोड़ते/निकालते हैं तो इसे घटाएं/घटाएं। – Crozin

+0

हाय क्रोजिन, यह वही है जो मैं वास्तव में कर रहा हूं। लेकिन मैं यह काम करना चाहता हूं क्योंकि मैं अंतिम 24h, अंतिम दिन, पिछले महीने के लिए "सबसे गर्म" पोस्ट प्राप्त करने के लिए 'WHERE post.date>?' जैसे बयान जोड़ना चाहता हूं ...मैं इन आदेशों को 'ऐप/कंसोल सिद्धांत के साथ चला रहा हूं: क्वेरी: डीक्यूएल' और 'ऐप/कंसोल सिद्धांत: क्वेरी: एसक्यूएल'। – Quentin

उत्तर

8

मैं कुछ परीक्षण करने के बाद उसके मैंने पाया कि सब कुछ ठीक हो रहा है के लिए तैयार करता है।

Video: id, title, ... 
Comment: id, video_id, content, ... 

डेटाबेस स्कीमा बहुत आसान है और मुझे लगता है कि किसी भी स्पष्टीकरण की आवश्यकता नहीं है।

#DQL: 
    SELECT v.id, COUNT(c.id) AS num 
    FROM Video v 
    JOIN v.comments c 
    GROUP BY v.id 
    ORDER BY num DESC 

#Generated SQL: 
    SELECT v0_.id AS id0, COUNT(v1_.id) AS sclr1 
    FROM video v0_ 
    INNER JOIN video_comment v1_ ON v0_.id = v1_.video_id 
    GROUP BY v0_.id 
    ORDER BY sclr1 DESC 

#Result set: 
    Array 
    (
     [0] => Array 
      (
       [id] => 148 
       [num] => 3 
      ) 

     [1] => Array 
      (
       [id] => 96 
       [num] => 2 
      ) 

     [2] => Array 
      (
       [id] => 111 
       [num] => 1 
      ) 

     [3] => Array 
      (
       [id] => 139 
       [num] => 1 
      ) 

    ) 

आप अपनी आईडी के बजाय पूरे Video वस्तु का चयन करते हैं (v बजाय SELECT खंड में v.id) क्वेरी के रूप में अच्छी तरह से अमल होगा। बेशक id तत्व के बजाय Video ऑब्जेक्ट 0 वें तत्व के तहत होगा।

सिद्धांत 2.1.0-देव पर परीक्षण किया गया

0

संपादित: लोग - यह उत्तर काम नहीं करता है। कम से कम आप इसे संभावित समाधान से खत्म कर सकते हैं।

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post 

आप post.id द्वारा समूहीकरण थे, न post

btw, यह कुल अनुमान है। मुझे डीक्यूएल नहीं पता, लेकिन मुझे हाइबरनेट पता है, और ऐसा लगता है कि यह समान है। यदि यह गलत है तो मैं यह उत्तर हटा दूंगा - मुझे टिप्पणी से बताएं।

+0

हाय बोहेमियन, 'पोस्ट' द्वारा समूहित करना कोई बेहतर नहीं बनाता है। मेरे पास सटीक एक ही आउटपुट है। – Quentin

-1

मैं DQL पता नहीं है, और इस बेवकूफ हो सकता है .... लेकिन आप इस पोस्ट की गई:

SELECT post, COUNT(comment.id) AS num 
FROM Entity\Post post 
LEFT JOIN post.comments comment 
GROUP BY post.id 

आप post.id का चयन नहीं किया जाना चाहिए? मुझे पता है कि यह अजीब लगता है, लेकिन जो मैं समझता हूं, select postselect * के बराबर है। फिर भी, आपके आउटपुट में, आपको केवल आईडी कॉलम मिल रहा है। मैंने सोचा कि यह ध्यान देने योग्य हो सकता है (भले ही यह नहीं है)।

/downvote

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

  • कोई संबंधित समस्या नहीं^_^