簡體   English   中英

have 子句中的未知聚合列

[英]Unknown aggregate column in having clause

我正在嘗試在 PHP + MySQL 中構建基於位置的事件搜索(使用 Laravel 及其 Eloquent ORM)

這是我正在使用的查詢:

select 
    events.*, 
    ( 3959 * acos( cos( radians(50.5) ) * cos( radians( addresses.latitude ) ) * cos( radians( addresses.longitude ) - radians(9.50) ) + sin( radians(50.5) ) * sin( radians( addresses.latitude ) ) ) ) AS distance

 from 
    `events` inner join `addresses` on `events`.`address_id` = `addresses`.`id`
 having 
    `distance` <= 10 
 order by 
    `id` desc limit 15 offset 0

我想知道為什么會彈出這個錯誤,即使距離列在“選擇語句”中。

"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'distance' in 'having clause' (SQL: select count(*) as aggregate from `events` inner join `addresses` on `events`.`address_id` = `addresses`.`id` having `distance` <= 10 order by `id` desc)"

這是我用來將范圍添加到基本查詢的 PHP 代碼:

    $selectDistance =
        '( 3959 * acos( cos( radians(' . $latitude . ') ) ' .
        '* cos( radians( addresses.latitude ) ) ' .
        '* cos( radians( addresses.longitude ) - radians(' . $longitude . ') ) ' .
        '+ sin( radians(' . $latitude . ') ) ' .
        '* sin( radians( addresses.latitude ) ) ) ) AS distance';

    $query->select(DB::raw('events.*, ' . $selectDistance));
    $query->join('addresses', 'events.address_id', '=', 'addresses.id');
    $query->having('distance', '<=', $km);

非常感謝:)

從錯誤消息:

未發現柱:“SQLSTATE [42S22] 1054未知列在'距離' '其具有條款'(SQL:SELECT COUNT(*)作為骨料從events內部聯接addresseseventsaddress_id = addressesid具有distance <= 10順序由id desc)"

我們可以得到以下

查詢語句:

select count(*) as aggregate 
from `events` inner join `addresses` on `events`.`address_id` = `addresses`.`id` 
having `distance` <= 10 
order by `id` desc

distance不在選擇列表中。

HAVING 子句被引入到 SQL 中,因為我們不能使用帶有 WHERE 關鍵字的聚合函數。 根據您的查詢,SELECT 語句或 HAVING 子句中沒有聚合函數。 因此嘗試改變

having 
    `distance` <= 10 

where
    `distance` <= 10 

HAVING 子句應按以下格式使用。

HAVING aggregate_function(column_name) operator value

其中運算符可以是 =、>、<、<=、等等....

此外,您的 PHP 代碼也需要相應地更改。

下面的 SQL 教程鏈接可能會幫助您更好地理解 SQL 中 HAVING 子句的使用。

http://www.w3schools.com/sql/sql_have.asp

你可以試試這樣的

$selectDistance =
    '( 3959 * acos( cos( radians(' . $latitude . ') ) ' .
    '* cos( radians( addresses.latitude ) ) ' .
    '* cos( radians( addresses.longitude ) - radians(' . $longitude . ') ) ' .
    '+ sin( radians(' . $latitude . ') ) ' .
    '* sin( radians( addresses.latitude ) ) ) )'; 

$query->join('addresses', 'events.address_id', '=', 'addresses.id')
      ->select(DB::raw('events.*))
      ->selectRaw("{$selectDistance} AS distance")
      ->whereRaw("{$selectDistance} < ?", 10)
      ->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM