SQL - 选择分组依据的最低值并按顺序排序?

时间:2017-06-27 12:58:10

标签: sql laravel

在我的rankings数据库中,我有一个名为times的表。我还有另一张作者表。作者有作者ID(在ath_id表中名为times)。

保存在times表中的记录:

id            ath_id       brand_id       time           date
------------- ------------ -------------- -------------- --------------
65125537      5384729      3              44741          May 8  2014
72073658      4298584      1              1104           Jun 28 2015
86139060      4298584      2              2376           Nov 20 2016
92237079      4298584      1              1115           Jun 24 2017
92237082      4298584      1              1104           Jun 24 2017
93436362      5384729      12             376492         Dec 31 2012

我想要实现的目标

我想检索属于作者的时间的有序列表(通过作者ID)。我想按brand_id订购,我只想要time值最低的记录。

此外,当有多个记录具有相同的brand_id 相同的time值时,我希望按日期排序列表。所以最新日期的记录将是最后一次。

我拥有什么

我目前使用此查询:SELECT * FROM times WHERE ath_id = 4298584 GROUP BY brand_id ASC

它运行良好,但它将具有相同brand_id的记录限制为1,因此它会限制具有相同time的记录,即使多个记录具有最低time值也是如此。

总结一下

所以在上面的例子的情况下。当我选择ath_id = 4298584的所有记录时,我想要检索以下有序列表:

id            ath_id       brand_id       time           date
------------- ------------ -------------- -------------- --------------
72073658      4298584      1              1104           Jun 28 2015
92237082      4298584      1              1104           Jun 24 2017
86139060      4298584      2              2376           Nov 20 2016

这是我第一次做一些更高级的SQL查询。我正在与Laravel合作,因此使用Laravel Query Builder提供原始SQL解决方案和Laravel解决方案都不会造成任何伤害。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用派生表来获取ath_id和brand_id的最短时间。然后将其连接回原始表以获取其余数据。

SELECT t.*
FROM times t
JOIN (SELECT ath_id, brand_id, MIN(time) AS time FROM dbo.times GROUP BY ath_id, brand_id) b 
  ON t.ath_id = b.ath_id AND t.brand_id = b.brand_id AND t.time = b.time
WHERE t.ath_id = 4298584
ORDER BY t.brand_id ASC, t.date DESC

答案 1 :(得分:1)

这是你可以做到的另一种方式。虽然输出类似于SQLChao的答案,但区别在于内部查询正在创建并为ath_idbrand_iddate的组合分配排名,后跟{{1 }}。然后在外部查询中,您可以使用过滤器来分隔等级time。所以基本上你是在复制1函数。

如果您想要组合的第一个row_number()记录,可以rnk=1使用rnk <= n。但在你的情况下,SQLChao的答案会更快。

n