1

サイトへのユーザーログインが登録されるフィールドuid(INT)とTIME(TIMESTAMP)を持つMySQLテーブルがあります。

2日以上の間にサイトにアクセスしたユーザーの数を受け取る最も賢い方法は何ですか?その下で使用するスニペットよりも優れたものはありますか?

SELECT count(*) FROM
   (SELECT uid, count(*) as DistinctDayCount FROM 
       (SELECT uid, Time FROM Log GROUP BY uid, DATE(Time)) AS DistinctDays 
   GROUP BY uid) AS DaysCount
WHERE DistinctDayCount > 1
4

2 に答える 2

1

1つ少ないサブクエリでそれを行うことができます:

select count(*)
from (select uid, count(distinct date(time)) as DistinctDayCount
      from log
      group by uid
     ) t
WHERE DistinctDayCount > 1

ただし、正直なところ、次のようなクエリを使用して、各カウントの数値を確認します。

select DistinctDayCount, count(*), min(uid), max(uid)
from (select uid, count(distinct date(time)) as DistinctDayCount
      from log
      group by uid
     ) t
group by DistinctDayCount
order by 1

minとはmax、さらに調査できるユーザーIDの例を示しています。また、「1日以上ログインしたユーザーの数」などの次の質問は、「ログインした日数の分布はどのくらいか」であることがよくあります。

于 2013-01-24T12:22:47.570 に答える
0
select count(*) from
(
SELECT uid, min(Time), Max(Time) 
FROM Log 
GROUP BY uid 
HAVING DATEDIFF(max(Time),min(Time))>1
) t
于 2013-01-24T12:36:48.513 に答える