#mysql
#mysql
Вопрос:
Я создаю запрос, который получает общее количество клиентов на определенном расстоянии от каждого из наших магазинов, используя Haversine Formula
.
Эта формула довольно большая и выглядит уродливо, когда я использую ее в запросе, поэтому я решил создать из нее функцию, чтобы мои запросы выглядели чище.
Проблема в том, что когда я запускаю запрос с помощью функции, я получаю эту ошибку : Error Code: 2013. Lost connection to MySQL server during query
.
Как только я использую фактическую формулу вместо функции в своем запросе, она выполняется, как и ожидалось. Кто-нибудь знает, почему это происходит? Это проблема с тайм-аутом, потому что выполнение запроса занимает много времени?
Вот моя созданная пользователем функция Haversine:
CREATE DEFINER=`MYADMIN`@`%` FUNCTION `Haversine`(lat1 DECIMAL(15,10), lng1 DECIMAL(15,10), lat2 DECIMAL(15,10), lng2 DECIMAL(15,10)) RETURNS decimal(11,2)
BEGIN
RETURN (3959 * acos( cos( radians(lat1) ) * cos( radians( lat2 ) ) * cos( radians( lng2 ) - radians(lng1) ) sin( radians(lat1) ) * sin(radians(lat2)) ));
END
Этот запрос вызывает ошибку потерянного соединения:
SELECT s.StoreID
, count(c.PBID) as customers
, sum(c.Status = 'null') as 'Not Active'
, sum(c.Status = 'Left Message') as 'Left Message'
from console.Stores s
cross
join console.Customers c
where console.Haversine(s.Latitude,s.Longitude,c.Lat,c.Lng) <= 5
and c.DNC = '0'
and c.Status != 'Do Not Call'
group
by s.StoreID;
Это тот же запрос без функции, который выполняется как ожидалось:
SELECT s.StoreID, count(c.PBID) as customers, sum(c.Status = 'null') as 'Not Active', sum(c.Status = 'Left Message') as 'Left Message' from console.Stores s cross join console.Customers c where (3959 * acos( cos( radians(s.Latitude) ) * cos( radians( c.Lat ) ) * cos( radians( c.Lng ) - radians(s.Longitude) ) sin( radians(s.Latitude) ) * sin(radians(c.Lat)) ) ) <= 5 and c.DNC = '0' and c.Status != 'Do Not Call' group by s.StoreID;
Комментарии:
1. Либо вам не хватает предложения where, либо вы неправильно расшифровали
2. @P.Salmon извините, я пропустил предложение where, когда набирал это. Я отредактировал сообщение, чтобы внести это изменение.
3. Скорее всего, что-то связано с данными, поскольку запрос выполняется достаточно долго, чтобы время ожидания истекло.