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 为 5
、3
和 2
的行。
这是否可以使用 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 - 选择第一次出现列值的行的主要内容,如果未能解决你的问题,请参考以下文章