Запрос работает, когда функция не используется

#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. Скорее всего, что-то связано с данными, поскольку запрос выполняется достаточно долго, чтобы время ожидания истекло.