mysql distinct不会过滤唯一ID

时间:2016-03-18 08:56:55

标签: mysql sql

使用mysql我试图用一个在特定时间内没有出现的设备列表(serialno)显示结果(last_seen),然后只显示具有max(last_seen)的唯一设备。 last_seen是一个init值,它是一个在没有看到设备时递增(想想分钟)的数字。想象一个表有一行serialno“L123”,其中last_seen为“1”,然后又过了一​​分钟,serialno“L123”,last_seen为“2”,等等。使用max(last_seen),结果应显示最高数字或最后一次看到设备。

到目前为止工作,但我注意到设备serialno L123将在哪里显示两次,如何过滤结果只显示最高的last_seen?我尝试了两种使用distinct的方案,但它们似乎都不起作用。

作为我得到的(不工作)的一个例子

email             | serialno | Last seen (min)
abc@example.com   | L123     | 30
abc1@example.com  | K900     | 20
abc2@example.com  | L123     | 1 <--yes the email is different but same serialno

作为想看的内容的一个例子

email             | serialno | Last seen (min)
abc@example.com   | L123     | 30
abc1@example.com  | K900     | 20

场景1:在where子查询中选择distinct

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

2 个答案:

答案 0 :(得分:1)

带有子查询的

JOIN,用于查找每个serialno的max 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

答案 1 :(得分:0)

Distinct适用于您实际想要输出的值。如果在子选择中使用它,则还必须过滤子选择中的唯一值。

虽然在第一个查询中只按serialno分组。您只想获得serialno的分组结果。你不需要in子句或者有。