【问题标题】:How can I select tags from MySQL sorted by creation_date and name but remove duplicate name?如何从 MySQL 中选择按创建日期和名称排序的标签但删除重复名称?
【发布时间】:2013-06-03 23:46:02
【问题描述】:

我正在使用 MySQL 和 Laravel 3。

我有下表:

tags
  id         INT
  name       INT
  created_at TIMESTAMP

标签名称不是唯一的,标签通过数据透视表与另一个名为 cases 的表相关联。

我需要获取按名称排序的最近创建的 50 个标签)。问题是我只想要一个命名标签的实例(例如,如果有两个标签叫做“有趣”,那么我只想返回最近的一个。

例如,假设这是我的标签表:

id   name     created_at
1    funny    2013-4-10
2    sad      2013-6-5
3    angry    2013-1-3
4    funny    2013-6-7
5    grumpy   2013-5-20

我想按以下顺序返回标签:

funny(4)
sad(2)
grumpy (5)
angry(3)

请注意如何只返回一个“有趣”标签(最近的一个)。

我试过了:

$tags = DB::table('tags')->order_by('created_at', 'desc')->group_by('name')->distinct()->take(50)->get();?>

但上面的代码返回以下内容:

sad (2)
grumpy (5)
funny (1)  <--- this is the earlier tag NOT the most recent one
angry (3)

不知道我在这里做错了什么......

【问题讨论】:

    标签: mysql sql database laravel


    【解决方案1】:

    我不知道 laravel,但您似乎是按名称分组,而不是在 created_at 上使用聚合函数。

    在纯 SQL 中是

    SELECT name, MAX(created_at) FROM yourTable GROUP BY name ORDER BY MAX(created_at) DESC
    

    查看它在sqlfiddle 中的实时工作

    【讨论】:

    • 尽管这不是 Laravel 特定的语法,但它确实可以完美地工作。我只是使用 Laravel 的 DB::query() 方法执行了它。感谢您的努力和小提琴。
    【解决方案2】:
    DB::table('tags')->group_by('name')->order_by(DB::raw('MAX(created_at)'))->get(array('name', DB::raw(MAX('created_at'))))
    

    【讨论】:

    • 几乎只有两个问题。一,这是以相反的顺序返回它们(即最旧的标签在前,我希望最新的标签在前)。将 MIN() 换成 MAX() 似乎没有任何作用。
    • 第二个是错字 - 我认为 raw(MAX('created_at')) 应该是 raw('MAX(created_at)')
    • 已接受来自 tombom 的答案,但如果您能更正 sql 以颠倒顺序,将投票赞成。
    • order_by(DB::raw('MAX(created_at) DESC')) 呢?
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多