2016-03-26 23 views
1

im mit versuchen, eine standortbasierte Ereignissuche in PHP + MySQL zu bauen (mit Laravel und seine Eloquent ORM)Unbekannte Aggregat Spalte in Klausel

Dies ist die Abfrage ich verwende:

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 

Im wundern, warum dieser Fehler auftaucht, obwohl die Distanzspalte in der "Select-Anweisung" ist.

"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)" 

Dies ist der PHP-Code verwende ich den Bereich auf der Basis Abfrage hinzuzufügen:

$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); 

Thank you very much :)

+0

Ich frage mich, ob die 'ONLY_FULL_GROUP_BY' Systemparameter diesen Effekt haben würden. –

Antwort

2

Von der Fehlermeldung:

"SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'Distanz' in 'Having-Klausel' (SQL: Wählen Sie Anzahl (*) als Aggregat von events innere beitreten addresses auf events. address_id = addresses. id mit distance < = 10, um von id ab)“

Wir erhalten die folgende

SQL:.

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

distance ist nicht in der Auswahlliste

1

Die Die HAVING-Klausel wurde in SQL eingeführt, da wir keine Aggregatfunktionen mit WHERE-Schlüsselwort verwenden können Entsprechend Ihrer Abfrage gibt es innerhalb der SELECT-Anweisung oder der HAVING-Klausel keine Aggregatfunktion. Daher versuchen

having 
    `distance` <= 10 

zu

where 
    `distance` <= 10 

Die HAVING-Klausel verwendet werden soll, unter Format in zu ändern.

HAVING aggregate_function(column_name) operator value 

Wo Betreiber kann sein =,>, <, < =, ect ....

Außerdem PHP-Code auch entsprechend geändert werden müssen.

Unten SQL tutorial Link kann Ihnen helfen, die Verwendung der HAVING-Klausel in SQL besser zu verstehen.

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

Verwandte Themen