2013-08-02 5 views
6

Cerco di ottenere il valore massimo di una selezione mysql, ma voglio che sia nullo/vuoto/0 se c'è una riga che non contiene la data/ora.MySQL restituisce il valore massimo o null se una colonna non ha valore

statistiche da tavolo (simplyfied):

ID CLIENT ORDER_DATE  CANCEL_DATE 

    1  5  1213567200 
    2  5  1213567200 
    3  6  1210629600  1281736799 
    4  6  1210629600  1281736799 
    5  7  1201042800  1248386399 
    6  7  1201042800  
    7  8  1205449200  1271282399 

Ora sto cercando di ottenere la data di ordine più basso (nessun problema, come non è mai vuota), e il massimo si annullano data. Se il cliente ha già cancellato la sua iscrizione, la data di cancellazione è piena, ma se è ancora attiva, non vi è alcuna data di cancellazione.

Query:

SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT 

Returns:

ID OD   CD 
5 1213567200     // fine 
6 1210629600 1281736799  // fine 
7 1201042800 1248386399  // Should be empty 
8 1205449200 1271282399  // fine 

non riesco a capire come tornare vuoto/0/NULL se ce n'è uno (o più) colonne vuote per un cliente . Ho anche provato con i campi NULL.

Grazie per qualsiasi suggerimento.

risposta

5

Non so quanto veloce sarà, ma credo che possa essere risolto in questo modo:

SELECT ID, min(ORDER_DATE) AS OD, 
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD 
FROM stats GROUP BY CLIENT 

non ho potuto testarlo ma l'idea alla base di questa soluzione è che count(cancel_date) dovrebbe contare tutte le voci di valore non nullo e se è uguale a count(*) significa che non ci sono valori nulli e restituirà max(cancel_date), altrimenti null.

+0

non so se sarà più veloce del mio, penso che potrebbero essere equivalenti, ma è una buona idea :) +1 – fthiella

+0

Anche lavorando. Molte grazie. Era in giro per ore, ma non aveva questa semplice soluzione. La velocità è: 0,06 secondi per le righe ~ 6k. Quindi un po 'più veloce della soluzione di fthiella – Yenky

4

si potrebbe usare una query come questa:

SELECT 
    client, 
    min(ORDER_DATE) AS OD, 
    case when MAX(CANCEL_DATE IS NULL)=0 THEN max(CANCEL_DATE) END AS CD 
FROM 
    stats 
GROUP BY 
    CLIENT 

Vedere violino here.

  • CANCEL_DATE IS NULL saranno valutate sia per 0, quando CANCEL_DATE non è nullo, o 1 quando è nullo
  • MAX(CANCEL_DATE IS NULL) saranno valutate a 0 se non ci sono CANCEL_DATE con valori nulli, altrimenti il ​​suo valore sarà 1.
  • quando MAX(CANCEL_DATE IS NULL)=0 significa che non ci sono righe dove CANCEL_DATE è nullo e in questo caso è necessario restituire MAX (cancel_date), altrimenti è necessario restituire NULL.
+0

Questo funziona bene, grazie mille! – Yenky

+0

Per velocità: ha bisogno di 0,07 secondi su 6k righe – Yenky