我需要帮助解决****中的一些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计数(*)>捕获。 1,因为组有2行返回。然后我需要从{2}和removed=false
的那两个捕获行中选择一个SELECT。因此,如果为该组返回4行,并且其中2行为min(taskdate_time)
而另一行为removed=false
,那么我需要对最小removed=true
进行子选择,即2行所在taskdate_time
。
答案 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
...
但是,如果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))