0

一部のユーザー (IdUser で識別される) がさまざまなクエリを使用してAccessTblテーブルから行ったアクセスの最も古い (または最近の) 日付であるアクセス コード (IdAccess) を取得する方法を知る必要があります。各ユーザー。

CREATE TABLE AccessTbl ( 
IdAcess VARCHAR(16) UNIQUE NOT NULL, 
IdUser VARCHAR(16) NOT NULL,
TheDate DATE NOT NULL 
);
INSERT INTO AccessTbl (IdAcess, IdUser, TheDate) VALUES 
('A00', '0', '1983-12-30'), 
('A01', '0', '2004-09-09'), 
('A02', '1', '2013-02-01'), 
('A03', '1', '2012-05-09'), 
('A04', '2', '1983-12-30'), 
('A13', '2', '2013-03-01'), 
('A05', '2', '2004-09-09'), 
('A06', '3', '2013-02-01'), 
('A07', '3', '2012-05-09'), 
('A08', '4', '1983-12-30'), 
('A09', '4', '2004-09-09'), 
('A10', '5', '2013-04-01'), 
('A12', '5', '2013-03-01'), 
('A11', '5', '2012-05-01');

例:

ユーザ 5 の最新は「A10」で、最も古いのは「A11」です ユーザ 4 の最新は「A09」で、最も古いのは「A08」です

ただし、1 つのクエリだけですべてのユーザーのすべての最新の日付が必要です。

私は...

SELECT IdAcess, IdUser, TheDate
FROM AccessTbl
WHERE (
  TheDate IN (SELECT MAX(TheDate) FROM AccessTbl  GROUP BY IdUser)
)  GROUP BY IdUser;

しかし、私は持っています:

+---------+--------+
| IdAcess | IdUser |
+---------+--------+
| A01     | 0      |
| A02     | 1      |
| A05     | 2      |  //BAD!!!!! must be A13
| A06     | 3      |
| A09     | 4      |
| A10     | 5      |
+---------+--------+
6 rows in set (0.13 sec)

後で、私は試しました:

IdUser による AccessTbl GROUP から IdAcess、IdUser、MAX(TheDate) を選択します。

持っている...

+---------+--------+--------------+
| IdAcess | IdUser | MAX(TheDate) |
+---------+--------+--------------+
| A00     | 0      | 2004-09-09   | //Must be A01
| A02     | 1      | 2013-02-01   | 
| A04     | 2      | 2013-03-01   | //Must be A13
| A06     | 3      | 2013-02-01   |
| A08     | 4      | 2004-09-09   | //Must be A09
| A10     | 5      | 2013-04-01   |
+---------+--------+--------------+
6 rows in set (0.00 sec)

貴重なご協力ありがとうございます。

アン

4

3 に答える 3

0

ただの方法:

SELECT IdAcess AS Oldest, (SELECT IdAcess FROM AccessTbl
                           WHERE IdUser = 5
                           ORDER BY TheDate DESC LIMIT 1) AS Newest
FROM AccessTbl
WHERE IdUser = 5
ORDER BY TheDate ASC LIMIT 1

テストする SQL Fiddle は次のとおりです: http://sqlfiddle.com/#!2/4b0e68/36


IdAcessたった 1 つのクエリですべてのユーザーの最新情報を取得するには、次を実行します。

SELECT *
FROM AccessTbl a
LEFT JOIN AccessTbl b
  ON a.TheDate < b.TheDate AND a.IdUser = b.IdUser
WHERE b.TheDate IS NULL
ORDER BY a.IdUser

結果

IDACESS     IDUSER     THEDATE
A01         0          September, 09 2004 00:00:00+0000
A02         1          February, 01 2013 00:00:00+0000
A13         2          March, 01 2013 00:00:00+0000
A06         3          February, 01 2013 00:00:00+0000
A09         4          September, 09 2004 00:00:00+0000
A10         5          April, 01 2013 00:00:00+0000

テストする SQL Fiddle は次のとおりです: http://sqlfiddle.com/#!2/4b0e68/44

于 2013-04-18T04:56:39.037 に答える