2017-05-02 4 views
0

によって、私は、この表には、サーバーに接続し、最後のユーザー格納していますグループの複数のDATEDIFF

+----+----------------------------+-----------+ 
| id |   last_connection | something | 
+----+----------------------------+-----------+ 
| 1 | 2017-03-23 10:39:14.000000 | bleh  | 
| 2 | 2014-03-20 07:05:51.000000 | blah  | 
| 3 | ...      | ...  | 
+----+----------------------------+-----------+ 

私が選択して、のようなもので、最後の2ヶ月で活躍されているID数えることができます:SELECT count(*) as '2months' FROM統計WHERE TIMESTAMPDIFF(DAY, SUBSTRING_INDEX( last_connection , ' ', 1), CURDATE()) < 60、または​​との最後の3ヶ月でというように、私にこのような何かを取得:

+---------+ 
| 2months | 
+---------+ 
| 1337 | 
+---------+ 

を私の質問は:1つのユニークなクエリでグループいくつかのTIMESTAMPDIFFを行う方法があり、そしてsを取得します次のような何か?

+-----------+-------+ 
| last conn | count | 
+-----------+-------+ 
| 1month | 1337 | 
| 2month | 31337 | 
| 3month | ... | 
| ...  | ... | 
+-----------+-------+ 
+1

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

答えて

1
SELECT sum(TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) < 30) as '1months', 
     sum(TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) < 60) as '2months', 
     sum(TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) < 90) as '3months' 
FROM stats 

または短い

SELECT sum(last_connection > current_timestamp - interval 30 day) as '1months', 
     sum(last_connection > current_timestamp - interval 60 day) as '2months', 
     sum(last_connection > current_timestamp - interval 90 day) as '3months' 
FROM stats 
+0

短くて甘いDjeeeezus。本当にありがとう! – Ozh

0

これを行う1つの方法はUNION演算子、例えば使用することです:

SELECT '1month', count(*) 
FROM stats 
WHERE TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) BETWEEN 0 AND 30 

UNION 

SELECT '2months', count(*) 
FROM stats 
WHERE TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) BETWEEN 31 AND 60 

UNION 

SELECT '3months', count(*) 
FROM stats 
WHERE TIMESTAMPDIFF(DAY, SUBSTRING_INDEX(last_connection, ' ', 1), CURDATE()) BETWEEN 61 AND 90 

をまた、あなただけの範囲を使用する代わりにする必要があります<オペレータは、dupsを防止します。