2016-03-18 19 views
0

下使用mysql我試圖顯示與那些沒有出現在特定時間(last_seen)設備(的SerialNo)的列表中的結果,然後只與MAX(last_seen顯示獨特的設備)。 last_seen是一個初始值,它是一個數字,當設備沒有被看到時遞增(想象分鐘)。想象一下,有一行serialno爲「L123」,last_seen爲「1」的表格,然後再過一分鐘,serialno「L123」爲last_seen「2」,等等。使用max(last_seen),結果應該顯示最高的數字或上次看到設備的時間。MySQL的不同不會過濾唯一的ID

工作,到目前爲止,但我注意到,其中的SerialNo L123的設備會顯示兩次,我怎麼能對結果進行篩選,只顯示最高last_seen?我已經嘗試了兩種使用不同的場景,但它們都不起作用。

由於我所得到的(沒有工作)

email    | serialno | Last seen (min) 
[email protected] | L123  | 30 
[email protected] | K900  | 20 
[email protected] | L123  | 1 <--yes the email is different but same serialno 

至於什麼希望看到一個例子爲例

email    | serialno | Last seen (min) 
[email protected] | L123  | 30 
[email protected] | K900  | 20 

方案1:選擇在哪裏子查詢

不同
SELECT 
    email, 
    serialno, 
    max(last_seen) 

FROM 
    my_table 

WHERE 
    last_seen IN (SELECT last_seen FROM my_table WHERE last_seen > 0) 
    AND 
    serialno IN (SELECT distinct serialno FROM my_table) 

GROUP BY 
    2,1 

ORDER BY 
    3 DESC 

情景2:使用有,後羣

SELECT 
    email, 
    serialno, 
    max(last_seen) 

FROM 
    my_table 

WHERE 
    last_seen IN (SELECT last_seen FROM my_table WHERE last_seen > 0) 

GROUP BY 
    2,1 

HAVING 
    serialno in (SELECT distinct serialno FROM my_table) 

ORDER BY 
    3 DESC 
+0

'組由serialno' ... – jarlh

+1

一般GROUP BY規則說:如果指定了GROUP BY子句,SELECT列表中的每個列引用都必須標識一個分組列或者是一個集合函數的參數! – jarlh

+0

我,使用GROUP BY 1,結果仍顯示「由於我所得到的(不工作)的例子」頂部 – xiaohouzi

回答

1

JOIN與被用來找到每一個的SerialNo的最大last_seen值的子查詢:

select t1.* 
from my_table t1 
join (select serialno, max(Last_seen) Last_seen 
     from my_table 
     group by serialno) t2 
    on t1.serialno = t2.serialno and t1.Last_seen = t2.Last_seen 
order by t1.Last_seen desc 
+0

就是這樣。 –

+0

你搖滾!謝謝,這正是我所需要的 – xiaohouzi

0

的價值觀鮮明的作品你真正想要的輸出。如果您在子查詢中使用它,則還必須篩選子查詢中的唯一值。只有

集團通過的SerialNo雖然在第一個查詢。你只是想爲你的serialno分組結果。你不需要in子句或擁有。