如何在MySql选择/连接查询中获取每个名称的最新值?
我有一个生成记录列表的SQL查询:如何在MySql选择/连接查询中获取每个名称的最新值?,mysql,Mysql,我有一个生成记录列表的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
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
我正试图找到一种方法来过滤这个列表,这样我就只能得到每个人的最新(最大times.transactionid值)条目。重要的值是每个名称的最新times.entrytype
我希望结果是:
1 Joe Bloggs false 9
3 John Doe true 10
2 Mary Jane true 3
我尝试按名称分组,但没有返回最新的times.entrytype(可能是最早的?)
我知道PostgreSQL的独特功能,但这是MySQL
我也知道这似乎是一种常见的sql查询模式,但通过查看其他示例,我无法完全理解它应该如何工作:/
编辑:
SQL Fiddle链接:- 在中,确定特定
的uid
的最大值。您还可以将transactionid
条件移动到此子选择查询Where
- 现在,将此结果集连接回主表
- 对于MySQL版本8.0.2及更高版本,可以使用with以“更高效”的方式进行访问
SELECT users.uid,
users.name,
times.entrytype,
times.transactionid
FROM
(SELECT u1.uid,
MAX(t1.transactionid) AS max_transactionid
FROM users AS u1
JOIN cards AS c1 ON c1.eid = u1.uid
JOIN times AS t1 ON t1.cardid = c1.cardid
WHERE u1.active = true AND
c1.active = true AND
t1.date = '2018-10-25'
GROUP BY u1.uid
) AS dt
JOIN users ON users.uid = dt.uid
JOIN times ON times.transactionid = dt.max_transactionid
ORDER BY users.name ASC,
times.transactionid DESC
结果:
| uid | name | entrytype | transactionid |
| --- | ---------- | --------- | ------------- |
| 1 | Joe Bloggs | 0 | 9 |
| 3 | John Doe | 1 | 10 |
| 2 | Mary Jane | 1 | 3 |
您的MySQL服务器版本是什么?可以使用8.0.2及更高版本的窗口函数解决此问题。请参见:结果集中的哪列表示
时间。trans
值?SQL FIDLE链接added@MadhurBhaiya抱歉,我指的是times.transactionid值。编辑以澄清这一点(结果中的第3列)
| uid | name | entrytype | transactionid |
| --- | ---------- | --------- | ------------- |
| 1 | Joe Bloggs | 0 | 9 |
| 3 | John Doe | 1 | 10 |
| 2 | Mary Jane | 1 | 3 |