在我的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解决方案都不会造成任何伤害。
答案 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_id
,brand_id
和date
的组合分配排名,后跟{{1 }}。然后在外部查询中,您可以使用过滤器来分隔等级time
。所以基本上你是在复制1
函数。
如果您想要组合的第一个row_number()
记录,可以rnk=1
使用rnk <= n
。但在你的情况下,SQLChao的答案会更快。
n