1

私のクエリは、私が望んでいることを正確に行っていないようです。結果が 2 行以上である限り、クエリは結果を取得します。単一の行を取得すると、クエリは結果を取得しません。

SELECT私はできますがDISTINCT (ct.name)、これはgroup byと同じ問題を引き起こします。

SELECT  
   ct.name, 
   ( 3959 * acos(cos(radians(52.779716)) * cos(radians( com.gps_lat )) * cos(radians( com.gps_lon ) -
   radians(21.84803)) + sin( radians(52.779716) ) * sin( radians( com.gps_lat )))) as distance 
FROM cuisine_types as ct

入社した会社がcuisine_typeに所属しているかどうかを確認するために退社しました

LEFT JOIN company AS com ON (com.cuisine_type_id = ct.id)

ここでは結果をグループ化しているので、料理の種類が 2 回表示されることはありません。これは、結果が2行以上の場合にのみ機能するようです...

GROUP BY ct.name

ここでは、会社の距離がユーザーの優先検索半径内にあるかどうかを確認しています

HAVING distance < 20;

たとえば、料理の種類として「ファーストフード」、「ビーガン」、および「ヘルシー」を指定した場合、検索距離内にその料理の種類に関連する会社がいくつあっても、各料理の種類の 1 つだけが必要です。そのため、GROUP BY を使用して二重の料理タイプを除外します。これが、このクエリでの私のアプローチを理解するのに役立つことを願っています。

注: 1 つの会社に関連付けられている料理の種類は 1 つだけです。

ここにコメントなしの完全な SQL クエリ

SELECT ct.name, ( 3959 * acos( cos( radians(52.779716) ) * cos( radians( com.gps_lat ) ) * cos( radians( com.gps_lon ) - radians(21.84803) ) + sin( radians(52.779716) ) * sin( radians( com.gps_lat ) ) ) as distance FROM food_types as ct LEFT JOIN company AS com ON (com.cuisine_type_id = ct.id) GROUP BY ct.name HAVING distance < 20;

4

1 に答える 1

2

これを試して:

SELECT 
   ct.name, 
   min( ( 3959 * acos( cos( radians(52.779716) ) * cos( radians( com.gps_lat ) ) * cos( radians( com.gps_lon ) - radians(21.84803) ) + sin( radians(52.779716) ) * sin( radians( com.gps_lat ) ) ) ) ) as distance 
FROM
   cuisine_types as ct 
      LEFT JOIN company AS com ON (com.cuisine_type_id = ct.id) 
GROUP BY 
   ct.name 
HAVING 
   distance < 20;
于 2013-02-20T22:47:45.130 に答える