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コメントで説明されているように、呼び出された列がそうでない2つの行の最も早いタイムアウトを取得する必要があります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

よろしくお願いします!!!

編集:

もう少し説明するかもしれません。次の表の行を取得した場合:

ここに画像の説明を入力

赤でマークされた行は、group by によって返される行が 2 つあるため、CASE count(*) > 1 によってキャプチャされます。次に、その 2 つのキャプチャされた行から SELECT する必要がremoved=falseありmin(taskdate_time)ます。したがって、そのグループ化に対して 4 行が返され、そのうちの 2 行が返されremoved=false、もう1 行が返された場合、その 2 行removed=trueの最小値に対して副選択を行う必要があります。taskdate_timeremoved=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が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))
于 2013-02-22T15:39:53.953 に答える