【问题标题】:Laravel subquery whereInLaravel 子查询 whereIn
【发布时间】:2017-08-15 17:55:04
【问题描述】:

我的查询有问题。 我想做一个子查询,但它不返回结果。

这是我的代码:

        $distance_representations = Representation::select('id')
        ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
        ->limit(10)
        ->get();

    $representations = Representation::select('id', 'city', DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
        ->whereIn('id', $distance_representations)
        ->get();

    return view('search', array('representations' => $representations));

PostgreSQL 等价物:

select id, city, round((6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude))))::numeric, 1) as distance
from representations 
where id in (
    select id
    from representations
    where round((6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude))))::numeric, 1) < 50
    limit 10
)

谢谢

【问题讨论】:

  • 您在主选择子句中有一个比较

标签: laravel subquery


【解决方案1】:

也许你可以试试这个

    $distance_representations = Representation::find('id')
    ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
    ->limit(10)
    ->get();

    $representations = Representation::all()
    ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
    ->whereIn('id', $distance_representations.id)
    ->get();

希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    我不明白您为什么需要子查询?除非我遗漏了什么,否则您应该能够使用单个查询来选择您的数据。

    $representations = Representation::selectRaw('id, city, round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50 AS distance')
        ->where('distance', '<', 50)
        ->limit(10)
        ->get();
    

    【讨论】:

    • 谢谢,但不能在 where 子句中使用别名
    【解决方案3】:

    我找到了解决方案。我不能做得更好。谢谢。

    此解决方案有效!

    $representations_with_distance = Representation::select('id', 'city', DB::raw('round(6371 * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) - radians(?)) + sin(radians(?)) * sin(radians(latitude)))::numeric, 1) as distance'));
    
    $representation = DB::table(DB::raw("({$representations_with_distance->toSql()}) as rd"))
        ->where('distance', '<', '?')
        ->orderBy('distance')
        ->offset(0)
        ->limit(10)
        ->setBindings([$latitude, $longitude, $latitude,  $radius])
        ->get();
    
    return view('search', array('representations' => $representation));
    

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 2017-04-13
      • 2017-07-30
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多