gpt4 book ai didi

mysql - Laravel 查询生成器 - 如何仅获取匹配查询的最后一条记录

转载 作者:行者123 更新时间:2023-11-29 21:50:48 26 4
gpt4 key购买 nike

使用 Laravel 5.1,我有一个股票表,其中包含股票代码和公司名称,与包含每 15 分钟更新一次的报价的价格表建立一对多关系。谁能告诉我从两个表的连接中返回最新报价的最佳方法?也许是我没有想到的另一种解决方案?这是我的连接,它返回数据库中的每只股票和价格。

$quotes = DB::table('stocks')
->join('stock_prices', 'stocks.id', '=', 'stock_prices.stock_id')
->get();
return $quotes;

哪个返回

[
{
"id": 25,
"symbol": "MSFT",
"last_price": "53.60",
},
{
"id": 25,
"symbol": "MSFT",
"last_price": "54.80",
},
{
"id": 30,
"symbol": "BA",
"last_price": "144.74",
},
{
"id": 30,
"symbol": "BA",
"last_price": "145.60",
},
]

迁移

public function up()
{
Schema::create('stock_prices', function (Blueprint $table) {
$table->increments('id');
$table->decimal('last_price', 6, 2);
$table->decimal('net_change', 6, 2);
$table->decimal('percent_change', 4, 2);
$table->decimal('open', 6, 2);
$table->decimal('high', 6, 2);
$table->decimal('low', 6, 2);
$table->decimal('close', 6, 2);
$table->integer('volume');
$table->integer('stock_id')->unsigned()->nullable();
$table->timestamps();

$table ->foreign('stock_id')
->references('id')
->on('stocks')
->onDelete('cascade');
});
}

public function up()
{
Schema::create('stocks', function (Blueprint $table) {
$table->increments('id');
$table->string('symbol');
$table->string('name');
$table->boolean('confirmed');
$table->timestamps();
});

那么让它返回每只股票的最后更新价格的最佳方法是什么?要么使用返回的数组,要么使用新的 Laravel 查询生成器?或者 Eloquent 解决方案?

我花了 2 天的时间进行搜索,并将我的头撞在墙上,所以我们将非常感谢任何帮助。

旁注:我计划清除所有超过 30 天的内容,这样表格就不会太大。另外,当使用一些 Laravel 助手破解数组时,我有时会收到一个错误,说它不是一个数组,而是一个对象,有时会说它不是一个对象,而是一个数组。向我解释这一点的奖励积分。

最佳答案

可以为您提供每只股票的最新股价的原始查询如下所示:

select s.id, s.symbol, sp.price, sp.updated from (
select stock_id, max(updated) last_updated
from stock_price
group by stock_id
) q
join stock_price sp on (q.stock_id = sp.stock_id and q.last_updated = sp.updated)
join stock s on (sp.stock_id = s.id)
;

获取每只股票的 stock_price 的最新记录,然后连接回 stock_price 以获取价格,并连接到股票以获取代码。

使用查询生成器:

$groupBy = DB::table('stock_price')
->selectRaw('stock_id, max(updated) as last_updated')
->groupBy('stock_id');

$quotes = DB::table( DB::raw("({$groupBy->toSql()}) as q") )
->selectRaw('s.id, s.symbol, sp.price, sp.updated')
->mergeBindings($groupBy)
->join('stock_price as sp', function ($join) {
$join->on('q.stock_id', '=', 'sp.stock_id')
->on('q.last_updated', '=', 'sp.updated');
})
->join('stock as s', 'q.stock_id', '=', 's.id')
->get();

有点过时了,最好使用原始 SQL。

关于mysql - Laravel 查询生成器 - 如何仅获取匹配查询的最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33661577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com