2016-04-18 8 views
0

Ich arbeite mit einer Tabelle von Elementen mit Ablaufdatum, diese Elemente werden Benutzern zugewiesen.MySql - Standard-Datum von max innerhalb des Falles ausschließen

mag ich für jeden Benutzer bekommen, die höchste Ablauf date.The Ausgabe hier ist, dass Standardelemente mit einem ‚3000/01/01‘ Verfallsdatum initialisiert werden, die ignoriert werden sollen, wenn ein anderes Element für diesen Benutzer existiert .

ich habe eine Abfrage, das zu tun:

 
SELECT 
    user_id as UserId, 
    CASE WHEN (YEAR(MAX(date_expiration)) = 3000) 
     THEN (
      SELECT MAX(temp.date_expiration) 
      FROM user_items temp 
      WHERE YEAR(temp.date_expiration) <> 3000 and temp.user_id = UserId 
     ) 
     ELSE MAX(date_expiration) 
    END as date_expiration 
FROM user_items GROUP BY user_id 

Diese arbeitet, aber die Abfrage innerhalb DANN wird Block Leistung zu töten ein bisschen und es ist ein großer Tisch.

Gibt es also eine bessere Möglichkeit, das Standarddatum von der MAX-Operation zu ignorieren, wenn die CASE-Bedingung eingegeben wird?

Antwort

2
SELECT user_id, 
     COALESCE(
       MAX(CASE WHEN YEAR(date_expiration) = 3000 THEN NULL ELSE date_expiration END), 
       MAX(date_expiration) 
     ) 
FROM user_items 
GROUP BY 
     user_id 

Wenn es wenige User aber viele Einträge pro Benutzer in der Tabelle, können Sie Ihre Anfrage noch ein wenig mehr versuchen zu verbessern:

SELECT user_id, 
     COALESCE(
     (
     SELECT date_expiration 
     FROM user_items uii 
     WHERE uii.user_id = uid.user_id 
       AND date_expiration < '3000-01-01' 
     ORDER BY 
       user_id DESC, date_expiration DESC 
     LIMIT 1 
     ), 
     (
     SELECT date_expiration 
     FROM user_items uii 
     WHERE uii.user_id = uid.user_id 
     ORDER BY 
       user_id DESC, date_expiration DESC 
     LIMIT 1 
     ) 
     ) 
FROM (
     SELECT DISTINCT 
       user_id 
     FROM user_items 
     ) uid 

Sie benötigen einen Index für (user_id, date_expiration) für diese Arbeit schnell.

+0

Toller Perforationsschub! –