2013-09-16 5 views
7

Dies ist meine volle Abfrage:Mysql GROUP BY und ORDER BY 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 

Es gibt ein Problem mit Dritt das Skript join verursacht etwa 1 Minute auszuführen. Als ich es separattly in PMA laufen:

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

es wird noch sehr lang auszuführen.

Was ich will, ist eine, letzte Zeile von contacts für jeden Client, der in der Gruppe 4 (Client kann in verschiedenen Gruppen sein).

Danke.

+1

Was bedeutet 'DESCRIBE' /' EXPLAIN' zeigen für diese Abfrage? – BlitZ

+2

Entfernen Sie auch 'SELECT * ...' von dort. Wählen Sie bestimmte Spalten aus. Es könnte zusätzlichen Aufwand verursachen. 'SELECT *' könnte ein echter Geschwindigkeitskiller sein. – BlitZ

Antwort

6

Um versuchen, diese „letzte Reihe von Kontakten für jeden Kunden, der in der Gruppe 4 angefügt“:

in contacts dann
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 

Wenn contactId ist PK der zweiten Join-Klausel nicht erforderlich.

standardmäßig MySQL sortiert alle GROUP BY col1, col2, ... Anfragen, als ob Sie angegeben ORDER BY col1, col2, ... in der Abfrage als auch. Wenn Sie eine ORDER BY-Klausel explizit enthalten, die dieselbe Spalte Liste enthält, optimiert MySQL es ohne Geschwindigkeitsbegrenzung, obwohl die Sortierung immer noch auftritt. Wenn eine Abfrage GROUP BY enthält, aber den Aufwand für das Sortieren des Ergebnisses vermeiden möchten, können Sie die Sortierung nach mit ORDER BY NULL unterdrücken.

Die komplette docs.

Voll query:

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

Was ist der Punkt in 'ORDER BY NULL'? – GarethD

+1

@GarethD es ist eine Optimierung, im Grunde wird filesort nicht verwendet, wenn die Daten gruppiert werden – Stephan

+1

@CORRUPTT sorry über den Tippfehler, behoben jetzt, thx – Stephan