Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySql选择/连接查询中获取每个名称的最新值?_Mysql - Fatal编程技术网

如何在MySql选择/连接查询中获取每个名称的最新值?

如何在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

我有一个生成记录列表的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
我正试图找到一种方法来过滤这个列表,这样我就只能得到每个人的最新(最大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             |