2016-12-14 1 views
0

現在、私の会社のどのPCを所有しているのかを判断しようとしています。 私たちはすべてのログイン活動をMySQLテーブルに記録しています。MySQL:複数の発生をグループ化してカウントし、個々の組み合わせごとに最高の金額のみを表示します。

ここでは、どのユーザーがどのクライアントを使用しているかについての情報しか持っていませんが、ユーザーが他のマシンを使用する可能性があることを考えれば、特定のマシンで最も多くログインしているユーザーを確認する必要があります。この場合

Table: log 
+----+-----------+------+----------------+ 
| ID | Client | user | timestamp | 
+----+-----------+------+----------------+ 
| 1 | hostnamea | ab | xx.xx.xx xx:xx | 
| 2 | hostnameb | cd | xx.xx.xx xx:xx | 
| 3 | hostnameb | ab | xx.xx.xx xx:xx | 
| 4 | hostnameb | ab | xx.xx.xx xx:xx | 
| 5 | hostnamec | ab | xx.xx.xx xx:xx | 
| 6 | hostnamec | ef | xx.xx.xx xx:xx | 
| 7 | hostnamec | ef | xx.xx.xx xx:xx | 
+----+-----------+------+----------------+ 
(timestamp is actually unimportant, 
but maybe someone has an awesome optimization idea which includes the timestamp, 
so I leave it here) 

、ホスト名のユーザー「EF」は「hostnamec」の所有者になり

私はすでにこれまでのところ、私は「トップログイン」リストを表示することができました:

SELECT `user`, `client`, COUNT(*) logins 
FROM `log` 
WHERE `client` LIKE '_%' AND timestamp > "2016-09-00 00:00:00" # (filter out garbage and old machines) 
GROUP BY `client, `user` 
HAVING COUNT(*) > 10  (If there are less than 10 logins, the machine isn't being used anyways) 
ORDER BY `user`; 

これをユーザー、クライアント、およびいくつかのログインを返します。特定のユーザーがマシンにログインする頻度を指定します。

カウントで生成された余分な「ログイン」行にアクセスして使用する方法は本当に分かりません。

私の目標は、このようなものです:私の次のステップは、ホスト名を持つ別の既存のテーブルの上にアップデートすることだろうが、(それが理にかなっている場合)、それはユーザーに

UPDATE hosts 
INNER JOIN query(output of first query) USING (client) 
SET hosts.user = query.user 

を欠けている

+-----------+------+ 
| Client | user | 
+-----------+------+ 
| hostnamea | ab | (1xab, nothing else: ab wins) 
| hostnameb | ab | (2x ab,1x cd: ab wins) 
| hostnamec | ef | (2x ef, 1x ab: ef wins) 
+-----------+------+ 

誰でも私の最初のクエリで私を助けることができますか? Oracleの機能を含むいくつかのソリューションや、やや複雑に設計されたテーブルがすでに見つかりました。

SQLを使った単純な選択、更新、挿入以上のことをしなければならなかったので、長い時間が経ちました。正直言って、私はちょっと混乱して私が見つけたので、私は自分の質問をしています

答えて

0

where節でフィルタリングすることでこれを行うことができます。ここでは一つの方法である:

select l.* 
from log l 
where l.timestamp = (select max(l2.timestamp) 
        from log l2 
        where l2.user = l.user 
        ); 

これは、任意の日付の時点で所有者を取得するように容易に一般化である:

select l.* 
from log l 
where l.timestamp = (select max(l2.timestamp) 
        from log l2 
        where l2.timestamp <= $AsOfDate and l2.user = l.user 
        ); 
+0

を試してみて、私はほぼ完全に無視しようとしていますなぜなら、元の所有者ではないマシンに誰かがログインしている可能性があるからです。 ログテーブルにログインが複数回発生する可能性があります。どのログイン(ユーザー+クライアントの組み合わせ)が最も多く発生したのかを除外し、そのユーザーを新しいクライアントの所有者として使用したいと考えています。 – Flow

0

は、このクエリ

SELECT 
    Client 
, SUBSTRING_INDEX(GROUP_CONCAT(user ORDER BY Client DESC), ',', 1) user 
FROM 
log 
GROUP BY 
Client 
ORDER BY 
Client ASC 
+0

これまでのおかげで! しかし、これはすべてのログインの最後のエントリです。 私はすでにこれについて考えました。この方法では、タイムスタンプを使用してユーザーを特定することもできます。 私はちょうどそれで生きることができましたが、私たちは実際に彼らに属していないPCで働く多くのユーザーを持っています。 私は架空の値 "number_of_logins"を使用して、どのユーザーがマシンの所有者になるかを判断しようとしています – Flow

関連する問題