0

我需要一些 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

提前谢谢了!!!

编辑:

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

在此处输入图像描述

红色标记的行由 CASE count(*) > 1 捕获,因为 group by 返回了 2 行。然后我需要从 2 个捕获的行中选择一个 SELECTremoved=falsemin(taskdate_time). 因此,如果为该分组返回 4 行,并且其中 2 行是removed=false,而另一行是,removed=true那么我需要对taskdate_time2 行 where的最小值进行子选择removed=false

4

2 回答 2

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
于 2013-02-22T15:30:37.860 回答
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 
...

小提琴演示示例

但是,如果 COUNT > 1 并且没有任何记录 TH.removed 为真,那么这将返回该值的 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))
于 2013-02-22T15:39:53.953 回答