我需要知道如何获取访问代码(IdAccess)使用不同的表 AccessTbl 创建的某些用户(使用IdUser标识)访问的最旧(或更新)的访问日期查询。每个用户。
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'
但是,我只需要一个查询中所有用户的所有最新日期。
我试过......
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)
后来,我尝试了:
SELECT IdAcess,IdUser,MAX(TheDate) 来自AccessTbl GROUP BY IdUser;
...具有
+---------+--------+--------------+
| 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)
感谢您的宝贵帮助。
安
答案 0 :(得分:0)
如果您想同时获得最旧和最新版本,则需要使用子查询将现有日期(按IdUser过滤)与选定的最小和最大日期进行比较。
SELECT IdAcess
FROM AccessTbl
WHERE IdUser = ?
AND (
TheDate IN (SELECT MAX(TheDate) FROM AccessTbl WHERE IdUser = ?)
OR TheDate IN (SELECT MIN(TheDate) FROM AccessTbl WHERE IdUser = ?)
)
答案 1 :(得分:0)
您可以使用LEFT JOIN
;
获取用户5
的最新条目;
SELECT *
FROM AccessTbl a
LEFT JOIN AccessTbl b
ON a.TheDate < b.TheDate AND a.IdUser = b.IdUser
WHERE b.TheDate IS NULL AND a.IdUser = '5'
要获取最早的内容,只需将<
翻转为>
;
ON a.TheDate > b.TheDate AND a.IdUser = b.IdUser
要立即获取所有用户的最新行,只需跳过IdUser条件;
SELECT *
FROM AccessTbl a
LEFT JOIN AccessTbl b
ON a.TheDate < b.TheDate AND a.IdUser = b.IdUser
WHERE b.TheDate IS NULL
答案 2 :(得分: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小提琴:http://sqlfiddle.com/#!2/4b0e68/36
要在一个查询中为每个用户获取最新的IdAcess
,请执行以下命令:
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小提琴:http://sqlfiddle.com/#!2/4b0e68/44