如何从最接近今天的时间段获取不同日期时间段不同价格的产品的默认价格?

How to get the default price of the product with different prices from different date periods from the period closest to today?

my sqlfiddle eample

你好,

根据上面的sqlfiddle例子;

我有一个列出产品的 table A 和一个 table B,在与这些产品相关的不同时期具有不同的价格。

这里我根据用户选择的日期显示这些价格。没有问题。

但是,如果用户没有选择日期,我默认无法显示离今天最近的那段时间的价格。

在我给出的例子中,sql查询成功地做到了这一点,但我无法以laravel查询的形式成功地编写它。或者作为 Eloquent orm 查询

我该怎么做?

$query->select(['tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price'])
                            ->join('tableB', function($join) {
                            $join->on('tableA.id', '=', 'tableB.pro_id');
                            })->where(function($sq) use ($postFrom) {
                                $sq->when($postFrom[0]=='0', function ($syq) {
                                    $syq->whereRaw('DAYOFYEAR(curdate()) <= DAYOFYEAR(tableB.end_date)');
                                }, function ($stq) use ($postFrom) {
                                    $stq->whereDate('tableB.start_date', '<=', $postFrom[0])
                                       ->whereDate('tableB.end_date', '>=', $postFrom[0]);
                                });
                            })->orWhere(function($ssq) use ($postTo) {
                                $ssq->whereDate('tableB.start_date', '<=', $postTo[0])
                                    ->whereDate('tableB.end_date', '>=', $postTo[0]);
                    })->groupBy('tableA.id')->orderBy('tableB.price', $sortDirection);

注意 1:$postFrom 和 $postTo 是用户的开始和结束日期。如果用户没有提交日期,$postFrom 显示为 0。

note2: 我显示的是满足$postFrom[0] == '0'条件时的默认价格

note3: sqlfiddle 示例中的 '2021-03-07' 值用于示例,而不是动态当前值。

note4:根据这个查询,默认是第一期的价格值。但这不是我想要的。

note5: 我不能用'joinSub' 因为Laravel 版本是5.5.

note6:在我想转换为 Laravel 查询形式的示例中,sql 查询没有任何问题:

select `tableA`.*, `tableB`.`start_date`, `tableB`.`end_date`, `tableB`.`price`  
from `tableA` 
right join( 
  SELECT id, start_date, end_date, pro_id, price, DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff 
  FROM `tableB` GROUP BY id order by diff asc 
) `tableB` on `tableA`.`id` = `tableB`.`pro_id` where (date(`end_date`) >= '2021-03-07') 
  group by `tableA`.`id` order by `price` desc

这是您查询的等效查询。我还没执行。

如果 Laravel 版本大于 5.5

$query1 = DB::table('tableB')
          ->selectRaw("id, start_date, end_date, pro_id, price, DATEDIFF(end_date, '2021-03-07') AS diff")
         ->groupBy('id')->orderBy('diff','ASC');
    
TableA::select('tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price')
         ->joinSub($query1, 'tableB', function ($join)
        {
              $join->on('tableA.id', '=', 'tableB.pro_id');
        })
        ->whereDate('tableB.end_date','>=','2021-03-07')
        ->groupBy('tableA.id')->orderBy('price','DESC')->get();

对于Laravel 5.5

TableA::select('tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price')
         ->join(DB::raw("(SELECT id, start_date, end_date, pro_id, price, 
         DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff 
         FROM `tableB` GROUP BY id order by diff asc) table2 "), function ($join)
        {
              $join->on('tableA.id', '=', 'table2.pro_id');
        })
        ->whereDate('table2.end_date','>=','2021-03-07')
        ->groupBy('tableA.id')->orderBy('price','DESC')->get();