Laravel - 选择第一次出现列值的行

Posted

技术标签:

【中文标题】Laravel - 选择第一次出现列值的行【英文标题】:Laravel - select rows with first occurance of column value 【发布时间】:2018-05-05 10:33:03 【问题描述】:

我有与此类似的 DB 表 urls

id | user_id | name
----------------------------
1  | 56      | John
2  | 25      | Carry
3  | 56      | Jim
4  | 12      | Jolana
5  | 12      | Ava 

我需要做的是选择user_id第一次出现 的行,按id 在 DESC 中排序。在这种情况下,这意味着选择 ID 为 532 的行。

这是否可以使用 Eloquent 以某种方式实现,或者如果不能,则使用纯 SQL?我可以想象为此编写一个脚本,但我想让它与一个查询一起工作。

【问题讨论】:

你尝试过什么?你有模特吗,或者你想进入raw sql(我个人不会像下面的两个答案那样赞同)。如果您有一个名为Url 的模型,大致可以调用以下Url:all()->orderByDesc('id')->groupBy('user_id')。但是请注意config perks。 【参考方案1】:

用 SQL 很容易做到这一点:

select t.*
from t
where t.id = (select min(t2.id) from t t2 where t2.user_id = t.user_id);

【讨论】:

我不太明白这个查询,你能否调整它以适应我的表名urls 的示例? @JakubSzymsza 给你Demo。我猜你需要 MAX 而不是 MIN。【参考方案2】:

你可以使用ROW_NUMBER:

SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY id DESC) AS rn
      FROM tab_name) sub
WHERE rn = 1
ORDER BY id DESC;

DBFiddle Demo - MariaDB 10.2

DBFiddle Demo - MySQL 8.0

【讨论】:

在我的服务器上的 mysql 和 MariaDB 中,PARTITION BY 附近不断出现语法错误 @JakubSzymsza 可能您使用的是过时的版本。 我正在使用 MariaDB 10.0.34,但由于某种原因它仍然无法正常工作。但没关系,戈登的解决方案有效。谢谢。 @JakubSzymsza ROW_NUMBER 被引入 MariaDB 10.2.0 > 10.0.34

以上是关于Laravel - 选择第一次出现列值的行的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列的字段值选择具有相同列值的行

在 SQL 中选择具有唯一列值的行

在使用原始查询时选择比较 ormlite 中的两列值的行

选择最后一组连续行中的第一行

从具有重复列值的集合中选择第一条记录 C#

计算具有3个列值的行的出现次数相同的MySQL