我尝试创建一个子查询。目前,我的两个问题是:
{% 'url' %}
和
select `key` from messages group by `key`;
目的是突出显示我的表select * from messages where `key` = 'KEY_RECUP_AU_DESSUS' order by created_at DESC LIMIT 1;
按键分组的所有元素并保留最后一个元素(created_at desc)
谢谢
答案 0 :(得分:0)
这样的事情应该有效:
$data = DB::table('messages')->whereIn('key',function($q) {
$q->select('key')->from('messages')->groupBy('key');
})->latest()->take(1)->get();
答案 1 :(得分:0)
你可以用两种不同的方式做到这一点。
查询构建器:
DB::table('messages AS a')
->leftJoin('messages AS b', function($join) {
$join->on('a.created_at', '<', 'b.created_at');
$join->on('a.key', '=', 'b.key');
})
->groupBy(['a.key', 'a.message', 'a.created_at'])
->havingRaw('COUNT(b.key) < 1')
->select(['a.key', 'a.message', 'a.created_at'])
->get();
PARTITION BY的另一种方式
SELECT
key,
message,
created_at
FROM (
SELECT
key,
message,
created_at,
rank() OVER (PARTITION BY key ORDER BY created_at DESC) AS rank
FROM
messages
) AS foo WHERE foo.rank = 1;
如果我们假设您有这样的表格。
postgres=# select * from messages;
id | key | message | created_at
----+---------+------------------------+----------------------------
1 | contact | send from contact page | 2015-10-31 19:45:16.850698
2 | contact | contact page message | 2015-10-31 19:45:34.417231
3 | product | product 1 | 2015-10-31 19:45:44.49584
4 | product | product 2 | 2015-10-31 19:45:46.856691
5 | contact | hello it is me | 2015-10-31 18:45:35.801967
6 | about | who are you | 2015-10-31 19:46:04.123369
7 | product | product 3 | 2015-10-31 19:46:12.414364
8 | about | hi guys | 2015-10-31 19:46:18.23442
(8 rows)
结果将是两个不同的查询
postgres=# select key, message, created_at from (select key, message, created_at, rank() over (partition by key order by created_at desc) as rank from messages) foo where rank = 1;
key | message | created_at
---------+----------------------+----------------------------
about | hi guys | 2015-10-31 19:46:18.23442
contact | contact page message | 2015-10-31 19:45:34.417231
product | product 3 | 2015-10-31 19:46:12.414364
(3 rows)