0

我正在使用 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)

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

4

2 回答 2

0

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

在纯 SQL 中它将是

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

看到它在sqlfiddle中实时工作

于 2013-06-07T15:57:17.663 回答
0
DB::table('tags')->group_by('name')->order_by(DB::raw('MAX(created_at)'))->get(array('name', DB::raw(MAX('created_at'))))
于 2013-06-07T16:07:55.063 回答