我有一个生成记录列表的sql查询:
SELECT users.uid, users.name, times.entrytype, times.transactionid FROM users
JOIN cards ON cards.eid = users.uid
JOIN times ON cards.cardid = times.cardid
WHERE users.active = true
AND cards.active = true
AND times.date = "2018-10-25"
ORDER BY users.name ASC, times.transactionid DESC
举个例子:
1 Joe Bloggs false 9
1 Joe Bloggs true 8
1 Joe Bloggs false 7
1 Joe Bloggs true 6
1 Joe Bloggs false 5
1 Joe Bloggs true 4
3 John Doe true 10
2 Mary Jane true 3
2 Mary Jane false 2
2 Mary Jane true 1
我正在试图找到一种方法来筛选这个列表,以便只获取每个人的最新(最大时间.transactionid值)条目。重要的值是每个名称的最新times.entrytype。
我希望结果是:
1 Joe Bloggs false 9
3 John Doe true 10
2 Mary Jane true 3
我尝试按名称分组,但没有返回最新的times.entrytype(可能是最早的?)
我知道postgresql的distinct on,但这是mysql。
我也知道这似乎是一种常见的sql查询模式,但通过查看其他示例,我不太清楚它应该如何工作:/
编辑:
CREATE TABLE users (
uid int,
name varchar(32),
active Boolean
);
CREATE TABLE cards (
eid int,
cardid int,
active Boolean
);
CREATE TABLE times (
cardid int,
date varchar(16),
transactionid int,
entrytype Boolean
);
INSERT INTO users (uid, name, active) VALUES
( 1, "Joe Bloggs", 1),
( 2, "Mary Jane", 1),
( 3, "John Doe", 1),
( 4, "Bod Dylan", 0);
INSERT INTO cards (eid, cardid, active) VALUES
( 1, 10, 1),
( 2, 11, 1),
( 3, 12, 1),
( 4, 13, 0);
INSERT INTO times (cardid, date, transactionid, entrytype) VALUES
( 11, "2018-10-25", 1, 1),
( 11, "2018-10-25", 2, 0),
( 11, "2018-10-25", 3, 1),
( 10, "2018-10-25", 4, 1),
( 10, "2018-10-25", 5, 0),
( 10, "2018-10-25", 6, 1),
( 10, "2018-10-25", 7, 0),
( 10, "2018-10-25", 8, 1),
( 10, "2018-10-25", 9, 0),
( 12, "2018-10-25", 10, 1);
sql fiddle链接:http://sqlfiddle.com/#!9/6b0f0be/1/0
1条答案
按热度按时间zujrkrfu1#
在派生表中,确定
transactionid
对于特定的uid
. 你也可以改变你的位置Where
此子选择查询的条件。现在,将这个结果集连接回主表。
对于mysql版本8.0.2及更高版本,可以使用带有
Row_Number()
.尝试以下查询:
结果:
db fiddle视图