【问题标题】:Laravel - select rows with first occurance of column valueLaravel - 选择第一次出现列值的行
【发布时间】: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

标签: php mysql sql laravel eloquent


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多