2015-09-04 46 views
0

我正在搜索如何使用2-3列進行選擇,並將結果與​​一列中的參數作爲NULL,否則如果沒有用戶名爲NULL,取最大日期。MySQL - 採取特定的行是一個值NULL或最大值,不只是列

我的問題是,在結果中,IPADDR是最大停止時間行,如果沒有空行,我得到了IPADDR正確

對我很重要的可以通過用戶的搜索。

讓我們看看我的數據庫格式:

username  stoptime    ipaddr 
    peter  2012-10-16 00:00:00  1.1.1.1 
    obama  2014-03-12 00:00:00  1.1.1.2 
    peter  2013-10-16 00:00:00  1.1.1.3 
    obama    NULL    1.1.1.4 

當我啓動:

SELECT username,case when MAX(stoptime is NULL)=0 then max(stoptime) end as stoptime,ipaddr 
    FROM tb 
    WHERE username LIKE "%OBAM%" group by username; 

在這個例子中我希望從我的查詢這個結果:

obama    NULL    1.1.1.4 

取而代之的是這個:

obama    NULL    1.1.1.2 

謝謝!

+0

如果你有幾個記錄用'NULL'記錄你想得到什麼? – Alex

+0

那裏不會與具有相同的用戶名和停止時間作爲NULL重複,直到沒有停止時間,它不會在停止時間與NULL的另一行créate。 – zetoniak

+0

爲什麼你不把時間價值呢?或者可能創建另一列'starttime' – Alex

回答

0

您錯誤地使用了group by。特別是,您有select中的列不在group by中。 MySQL特別不鼓勵這樣做(請參閱here)。

最簡單的方法做你想要的是:

SELECT username, 
     (case when max(stoptime is null) = 0 
      then max(stoptime) 
     end) as stoptime, 
     substring_index(group_concat(ipaddr order by (stoptime is null) desc, stoptime desc), ',', 1) as ipaddr 
FROM tb 
WHERE username LIKE "%OBAM%" 
group by username; 

不過,也有這種方法一定的侷限性 - 如級聯中間串的大小。還有其他方法,但是這在很多情況下都適用。

+0

所以對於提供的數據樣本OP我們在'stoptime'中獲得了什麼值?似乎'coalesce(max(stoptime),0)'會返回'2014-03-12 00:00:00'?我錯了嗎? – Alex

+0

非常感謝,這已經解決了我的ipaddr值問題,但現在停止時間值我得到最後的停止時間,我可以改變它與另一個靜態值或什麼? 再次感謝您 – zetoniak

+0

您是對的亞歷克斯 – zetoniak

0

你幫了我很多,我不得不做一些改變,現在我必須連接這個查詢與一些左連接,非常感謝你,這是我的finnal查詢:只是害怕中間字符串的大小串聯,它可以與數百個,可能有成千上萬個不同的結果,如果它太長,我可以得到什麼問題?多久太久了?

SELECT username, coalesce(max(stoptime)) as lasstop, 
    substring_index(group_concat(ipaddr order by starttime desc), ',', 1) as ipaddr, 
    substring_index(group_concat(stoptime order by starttime desc), ',' ,1) as stopt, 
    CASE WHEN MAX(CASE WHEN stoptime IS NULL THEN 1 ELSE 0 END) = 0 
    THEN MAX(stoptime) END as x FROM tb WHERE username LIKE "%%" group by username; 

此致敬意。

相關問題