2013-08-02 16 views
6

değerine sahipse, bir mysql seçiminin maksimum değerini almaya çalışıyorum, ancak zaman damgası içermeyen bir satır varsa, boş/boş/0 olmasını istiyorum.MySQL dönüş maksimum değeri veya bir sütun

Tablo istatistiklerini (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 

şimdi (o asla boş olduğu gibi, hiç sorun) en düşük sipariş tarihi almak için arıyorum ve maksimum randevuyu iptal. Müşteri aboneliğini zaten iptal etmişse, iptal tarihi doldurulur, ancak hala aktifse, iptal tarihi yoktur.

Sorgu:

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

İade:

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

ben bir (veya daha fazla) varsa bir müşteri için boş colums boş/0/NULL dönmek için nasıl bilemiyorum . Ayrıca NULL alanları ile çalıştı.

Herhangi bir ipucu için teşekkürler.

cevap

5

ben öyle olacak kadar hızlı bilmiyorum ama böyle çözülebilir tahmin:

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

ben bunu test edemedim ama bu çözümün arkasındaki fikir count(cancel_date) saymak gerektiğidir Tüm boş değer girişleri ve count(*) eşitse, boş değerlerin yok demektir ve max(cancel_date) döndürür, aksi halde sıfır.

+0

'da 0,07sec'e gereksinim var, benimkilerden daha hızlı olup olmayacağını bilmiyorum, sanırım eşdeğer olabilirler, ama bu güzel bir fikir :) +1 – fthiella

+0

Çalışma. Çok teşekkürler. Saatlerce uğraşıyordu, ama bu basit çözümü almamıştı. Hız: ~ 6k satırlar için 0.06sn. Yani fthiella'nın çözümünden biraz daha hızlı – Yenky

4

Böyle bir sorgu kullanabilirsiniz:

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 

keman here bakınız. CANCEL_DATE boş değilken

  • CANCEL_DATE IS NULL, 0 ya da değerlendirilecek ya da 1 başka türlü değeri olur, boş değerleri ile hiçbir CANCEL_DATE varsa
  • MAX(CANCEL_DATE IS NULL) 0 değerlendirilecektir null olduğunda 1.
  • , MAX(CANCEL_DATE IS NULL)=0 olduğunda, CANCEL_DATE değerinin sıfır olmadığı satırlar olmadığı ve bu durumda MAX (cancel_date) döndüğümüz anlamına gelir, aksi halde NULL döndürmemiz gerekir.
+0

Bu iyi çalışıyor, çok teşekkürler! – Yenky

+0

Hız için: 6k satırlar – Yenky