对于每条记录,还要选择具有最高记录值的数据

时间:2017-05-20 22:40:34

标签: php mysql sql greatest-n-per-group

晚上好,

我有以下两张表:

脚本

*----------------------------*
| user | script_id |   name  |
*----------------------------*
| 408  |    1      | script1 |
| 408  |    3      | script2 |
*----------------------------*

script_versions

*--------------------------------*
| id | version |      script     |
*--------------------------------*
|  1 |    1    | print "script1" |
|  1 |    2    | print "script2" |
|  3 |    0    |  print "other1" |
|  3 |    1    |  print "other2" |
*--------------------------------*

scripts包含有关脚本的一些常规信息,例如其名称和所有者的用户ID。表script_versions包含每个脚本的所有不同版本的代码。

现在我要从数据库中检索:

我想获得给定version的所有脚本的最新版本(即最高user个数字。)

例如,对于给定的数据,查询应该返回:

通缉结果

*-------------------------------------------------*
| id | version |      script     | user |   name  |
*-------------------------------------------------*
|  1 |    2    | print "script2" | 408  | script1 |
|  3 |    1    |  print "other2" | 408  | script2 |
*-------------------------------------------------*

到目前为止我尝试了什么

这是我现在的询问。它不起作用,因为它并不总是选择最新版本(事实上,它目前总是选择最旧的)所有脚本。

代码:

SELECT * 
  FROM scripts 
  LEFT 
  JOIN 
     ( SELECT * 
         FROM script_versions 
       GROUP 
         BY id 
      ORDER 
          BY version DESC 
      ) AS versions 
          ON scripts.script_id = versions.id 
      WHERE scripts.user = ?

编辑:

这个问题不是this question的重复,因为提到的不是关于排序/排序结果(通过最新版本)。

1 个答案:

答案 0 :(得分:1)

尝试

select scripts.id, v.version, v.script, scripts.user, scripts.name
from scripts s
inner join
(select id, max(version) as version from script_versions group by id) aux
on aux.id = s.script_id
inner join script_versions v on v.id = aux.id and v.version = aux.version
where user = ?