2013-09-16 10 views
7

द्वारा आदेश यह मेरा पूर्ण क्वेरी है:Mysql ग्रुप द्वारा और DESC

SELECT * FROM `clientgroupassign` 
LEFT JOIN `clients` ON `clientgroupassign`.clientId = `clients`.clientId 
LEFT JOIN `users` ON `carerId` = `userId` 
LEFT JOIN 
    (SELECT * FROM 
     (SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC) 
     as `contacts` 
    GROUP BY (`contactClientId`) 
    ) AS `contacts` ON `contactClientId` = `clients`.clientId 
WHERE groupId = 4 
ORDER BY `clients`.clientId 

तीसरे स्क्रिप्ट के बारे में 1 मिनट के लिए निष्पादित करने के लिए पैदा कर रहा शामिल होने के साथ एक समस्या है। जब मैं इसे पीएमए में अलग से चलाता हूं:

SELECT * FROM (SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC) AS `contacts` GROUP BY (`contactClientId`) 

इसे अभी भी निष्पादित करने में बहुत लंबा समय लगता है।

मैं चाहता हूं कि समूह 4 में मौजूद प्रत्येक ग्राहक के लिए contacts से पिछली पंक्ति पंक्ति प्राप्त करें (ग्राहक विभिन्न समूहों में हो सकता है)।

धन्यवाद।

+1

क्या 'DESCRIBE' /' EXPLAIN' उस क्वेरी के लिए प्रदर्शित करता है? – BlitZ

+2

इसके अलावा, वहां से 'SELECT * ...' हटाएं। विशिष्ट कॉलम का चयन करें। यह ओवरहेड जोड़ सकता है। 'चयन *' वास्तविक गति हत्यारा हो सकता है। – BlitZ

उत्तर

6

प्राप्त करने के लिए "पिछले प्रत्येक ग्राहक जो समूह 4 में है के लिए संपर्कों से सड़क जोड़ी" इस प्रयास करें:

SELECT 
    c.* 
FROM(
    SELECT 
     contactClientId, 
     MAX(contactId) as cid 
    FROM 
     contacts 
    WHERE 
     contactGroup = 4 
    GROUP BY 
     contactClientId 
    ORDER BY 
     NULL 
) as tmp 
INNER JOIN contacts as c 
    ON c.contactId = tmp.cid 
    AND c.contactClientId = tmp.contactClientId 

तो contactIdcontacts में पी तो दूसरी में शामिल होने के खंड की जरूरत नहीं है।

डिफ़ॉल्ट रूप से, MySQL col1, col2 सभी ग्रुप सॉर्ट करता, ... प्रश्नों के रूप में अगर col1, col2 द्वारा आप निर्दिष्ट क्रम, ... क्वेरी में रूप में अच्छी तरह। यदि आप में स्पष्ट रूप से क्लॉज द्वारा ORDER शामिल है जिसमें एक ही कॉलम सूची है, तो MySQL इसे किसी भी गति दंड के बिना अनुकूलित करता है, हालांकि सॉर्टिंग अभी भी होती है। यदि किसी क्वेरी में ग्रुप BY शामिल है लेकिन आप परिणाम को सॉर्ट करने के ओवरहेड से बचें, तो आप द्वारा ऑर्डर द्वारा निर्दिष्ट सॉर्टिंग को दबा सकते हैं।

पूर्ण docs

पूर्ण क्वेरी:

SELECT * FROM `clientgroupassign` 
LEFT JOIN `clients` ON `clientgroupassign`.clientId = `clients`.clientId 
LEFT JOIN `users` ON `carerId` = `userId` 
LEFT JOIN 
    (
     SELECT 
      c.* 
     FROM(
      SELECT 
       contactClientId, 
       MAX(contactId) as cid 
      FROM 
       contacts 
      WHERE 
       contactGroup = 4 
      GROUP BY 
       contactClientId 
      ORDER BY 
       NULL 
     ) as tmp 
     INNER JOIN contacts as c 
      ON c.contactId = tmp.cid 
      AND c.contactClientId = tmp.contactClientId 
    ) AS `contacts` ON `contactClientId` = `clients`.clientId 
WHERE groupId = 4 
ORDER BY `clients`.clientId 
+1

'ऑर्डर द्वारा नल' में क्या बात है? – GarethD

+1

@GarethD इसका अनुकूलन है, मूल रूप से फाइलों का उपयोग नहीं किया जाएगा जब डेटा – Stephan

+1

@CORRUPT टाइपिंग के बारे में खेद है, निश्चित रूप से, thx – Stephan

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