如果行数超过1,请获取最早的时间

时间:2013-02-22 15:25:58

标签: mysql

我需要帮助解决****中的一些MySQL问题...无论如何,我得到了以下sql:

SELECT id,count(*),
 CASE 
    WHEN count(*) > 1 THEN
        // I need the minimal `taskdate_time` column from the selected rows
        // where a certain boolean is active 
 ELSE taskdate_time
 END
FROM timehistory th
WHERE `send`=true
GROUP BY date_format(taskdate_time, "%Y-%m-%d"), user_id

如评论中所述,我需要获得最早的时间,其中一行名为removed的列不是FALSE

我如何实现这一目标?

我的专栏是:

`id` - int
`taskdateuser_id` int
`user_id` int
`changed_by` int
`batch_id` int
`taskdate_time` timestamp
`send` tinyint
`isread` tinyint
`update` tinyint
`removed` tinyint

非常感谢提前!!!

编辑:

我可能会解释一下。如果我得到以下表格行:

enter image description here

红色标记的行由CASE计数(*)>捕获。 1,因为组有2行返回。然后我需要从{2}和removed=false的那两个捕获行中选择一个SELECT。因此,如果为该组返回4行,并且其中2行为min(taskdate_time)而另一行为removed=false,那么我需要对最小removed=true进行子选择,即2行所在taskdate_time

2 个答案:

答案 0 :(得分:1)

SELECT  id,
        count(*),
        CASE WHEN count(*) > 1 
             THEN (SELECT MAX(taskdate_time) FROM timehistory f WHERE f.id = th.id AND removed = 0)
             ELSE taskdate_time
        END
FROM    timehistory th
WHERE   `send` = true
GROUP   BY date_format(taskdate_time, "%Y-%m-%d"), user_id

答案 1 :(得分:0)

您可以尝试这样的事情:

SELECT TH.user_id, COUNT(*), 
  CASE WHEN COUNT(*) > 1 
  THEN MIN(IF(TH.removed, TH.taskdate_time, NULL))
  ELSE TH.taskdate_time
  END   
FROM TimeHistory TH 
...

Sample Fiddle Demo

但是,如果COUNT> 1并且没有TH.removed为true的任何记录,那么这将为该值返回NULL。在这些情况下它应该返回什么?

<强> - 编辑 -

在回复评论时,这应该只是用COALESCE

包装它
  COALESCE(
    CASE 
    WHEN COUNT(*) > 1 
    THEN MIN(IF(TH.removed, TH.taskdate_time, NULL))
    ELSE TH.taskdate_time
    END, MIN(TH.taskdate_time))