2017-08-14 34 views
1

我有如下表:选择最高的日期,如果不是零


邮件

  • ID(INT 11自动递增)
  • USER_ID(INT 11)
  • 主题(varchar 255)
  • body(text)
  • 删除(日期时间)

默认情况下,当一些被删除的deleted列将被设置为删除日期deleted列保存价值0000-00-00 00:00:00。例如:2017-08-14 09:37:13

现在我想查询该表,并得到无论是user_id记录,其中deleted = 0000-00-00 00:00:00或者最近deleted值,如果没有用户的记录,其中deleted = 0000-00-00 00:00:00

+4

如果您的数据库中的日期为零,则您的数据中有很多需要清理的垃圾。如果它们不应该被分配,那它们应该是'NULL'。不要将“神奇数字”用于这些目的,它会隐藏代码中的错误。 – tadman

+3

传统数据库。你可能知道这种感觉 – Geert

+0

我可能在这里错过了这个问题。难道你不能通过删除(降序)排序并选择第一个值吗?你能写一个示例查询,显示结果并解释你不想要的结果吗? – Niklas

回答

1

您可以按特定的值在顶部的情况下:

select user_id 
from YourTable 
order by 
     case 
     when deleted = '0000-00-00 00:00:00' then '9999-12-31 23:59:59' 
     else deleted 
     end desc 
limit 1 

哪里'9999-12-31 23:59:59'maximum value of a datetime

对于多用户,你可以在最大查找与联接:

select * 
from Mails m1 
join (
     select user_id 
     ,  max(
       case 
       when deleted = '0000-00-00 00:00:00' then '9999-12-31 23:59:59' 
       else deleted 
       end) max_deleted 
     from Mails 
     group by 
       user_ud 
     ) m2 
on  m1.user_id = m2.user_id 
     and case 
      when m1.deleted = '0000-00-00 00:00:00' then '9999-12-31 23:59:59' 
      else m1.deleted 
      end = m2.max_deleted 
+0

有限制1,它的作品是耶。你知道一种方法来让它适用于多个user_id记录吗? – Geert

+0

谢谢,能够让你的编辑工作! – Geert

0

制作一个轻微修正Andomar的答案删除,你可以尝试类似的限制:

SELECT user_id 
FROM YourTable 
WHERE 
     case 
     when deleted = '0000-00-00 00:00:00' then 'true' 
     else deleted then 'true' 
     end desc = 'true' 

由于Case语句按顺序运行,如果删除的日期为'0000-00-00 00:00:00',则会尝试并返回WHERE子句中的过滤条件,如果该条件成立,则它将移至下一个总是保留的案例并通过过滤器。

虽然不是最漂亮的。

相关问题