2017-05-03 3 views
0

Wir speichern die Kundendaten wie Name, userId und Gesamtbetrag, die sie für verschiedene Aufträge ausgegeben haben, jetzt möchte ich einen Kunden in Ränge 1 bis 4 basierend auf Gesamtbetrag er gruppieren bis jetzt ausgegeben. Unten ist das Skript, das ich benutze, aber es braucht viel Zeit, gibt es einen besseren Weg, dies zu tun? Es gibt keinen Index für dateCreate Field.So gruppieren Sie Kunden in 4 Ränge mit MYSQL Abfrage

public function getBiggestSpenders($customerUserId){ 
     global $db, $database; 
     $sql = "SELECT userId, SUM(total) AS Total, ORD.dateCreate 
      FROM $database.`order` ORD 
      WHERE year(ORD.dateCreate) >= '2013' 
      group by ORD.userId 
      order by Total DESC"; 
     $result = $db->getTable($sql); 
     $numRows = count($result); 
     $flag=0; 
     for($i=0;$i<$numRows && $flag==0;$i++){ 
      $userId = $result[$i]['userId']; 
      if($userId==$customerUserId){ 
       $position = $i; 
       $Total = $result[$i]['Total']; 
       $flag=1; 
      } 
     } 
     $quartile = $this->getQuartiles($numRows, $position); 
     if($quartile==1) 
      return $quartile; 
     else 
      return 0; 
    } 
    public function getQuartiles($numRows, $position){ 
     $total  = $numRows; 
     $segment = round($total/4);  
     $Quartile = floor($position/$segment) + 1; 
     return $Quartile; 
    } 

Vielen Dank!

+0

Haben Sie einen Index auf 'dateCreate' Spalte? –

+0

Bitte bearbeiten Sie Ihre Frage und tag richtig: Wenn dies PHP-Code ist, fügen Sie 'php'-Tag, wenn Sie eine reine SQL-Lösung, um die PHP zu vermeiden wollen, fügen Sie' sql'-Tag. Entfernen Sie das Tag 'group'. Ich nehme an, dass das, was viel Zeit kostet, die Abfrage selbst ist, nicht das Zeug, das danach kommt, oder? –

Antwort

1

Um die Geschwindigkeit zu verbessern, können Sie einen Index für dateCreate Spalte erstellen und die folgende Bedingung verwenden, um MySQL es verwenden:

WHERE ORD.dateCreate >= '2013-01-01' 

Soweit Gruppierung betrifft, so können Sie CASE Anweisung Gruppen definieren basierend auf Ausgaben, zB:

SELECT userId, SUM(total) AS Total, 
CASE 
WHEN Total >= 2000 then 1 
WHEN Total >= 1000 AND Total <2000 THEN 2 
WHEN Total >=500 AND Total < 1000 THEN 3 
ELSE 4 
END as `rank`, 
ORD.dateCreate 
FROM $database.`order` ORD 
WHERE ORD.dateCreate >= '2013-01-01' 
group by ORD.userId 
order by Total DESC 
+0

Die Gesamtwerte für jeden Kunden ändern sich (steigen), wie erhalten wir das Limit für jeden Rang (wie 2000, 1000, 500 oder weniger)? – Developer

+0

Sie müssen also die Bereiche (Grenzwerte für jeden Rang) für die Ausgaben definieren, um die Kunden zu gruppieren. Dies hängt davon ab, wie die Anwendung die Liste gruppieren/ausgeben muss. –

Verwandte Themen