【发布时间】:2018-02-24 02:28:52
【问题描述】:
使用 Eloquent,试图找到一种方法来获取每一行的最新行,分组方式为:exchange、base、quote
数据
exchange base quote price value created_at
bittrex BTC USD 10000 10000 2018-01-05
bittrex BTC USD 9000 9000 2018-01-01
poloniex BTC USD 10001 10001 2018-01-05
poloniex BTC USD 9000 9000 2018-01-01
binance BTC USD 10002 10002 2018-01-05
binance BTC USD 9000 9000 2018-01-01
binance ETH USD 800 800 2018-01-05
binance ETH USD 700 700 2018-01-01
结果:
bittrex BTC USD 10000 10000 2018-01-05
poloniex BTC USD 10001 10001 2018-01-05
binance BTC USD 10002 10002 2018-01-05
binance ETH USD 800 800 2018-01-05
更新
我选择了@Cryode 解决方案,使用原始 SQL 而不是 Eloquent(如果有人能想出一个 Eloquent 查询来复制下面的查询结果,请随时发布)。
我还更改了表的结构以添加id(增量)作为主键。我还添加了以下索引$table->index(['exchange', 'base', 'quote', 'created_at']);
解决办法如下:
$currencies = DB::select('SELECT *
FROM (
SELECT DISTINCT exchange, base, quote
FROM tickers
) AS t1
JOIN tickers
ON tickers.id =
(
SELECT id
FROM tickers AS t2
WHERE t2.exchange = t1.exchange
AND t2.base = t1.base
AND t2.quote = t1.quote
ORDER BY created_at DESC
LIMIT 1
)
');
谢谢
【问题讨论】:
-
你可以试试这个吗?
Table::orderBy('created_at','asc')->groupBy('exchange')->get() -
嗯,试过这个:
Ticker::orderBy('created_at','asc')->groupBy('exchange', 'base_currency', 'quote_currency')->get()但不确定如何只检索每个“组”的最新行 -
类似于 Ticker::distinct()->orderBy('created_at', 'asc')->groupBy('exchange')->get(['exchange']);这将得到不同的交流......我觉得这已经接近解决方案了。
-
你 created_at 也包括时间,对吧?
-
是的时间也是如此
标签: laravel laravel-5 eloquent greatest-n-per-group