1

看来我的查询并不完全符合我的要求。只要结果是 2 行或更多行,查询就会得到结果。当我得到一行时,查询没有得到任何结果。

SELECTI can doDISTINCT (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

离开加入公司以检查公司是否附属于美食类型

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

在这里,我将结果分组,因此没有美食类型出现两次。这似乎只在结果为 2 行或更多行时才有效......

GROUP BY ct.name

在这里,我正在检查公司的距离是否在用户偏好的搜索范围内

HAVING distance < 20;

例如,如果我将“快餐”、“素食”和“健康”作为美食类型,那么无论搜索距离中有多少公司与该美食类型相关,我都只想要每种美食类型中的一种。因此,我使用 GROUP BY 过滤掉双重美食类型,希望这有助于理解我在此查询中的方法。

注意:公司只有一种美食类型。

没有注释的完整sql查询在这里

SELECT ct.name, ( 3959 * acos( cos( 弧度(52.779716) ) * cos( 弧度( com.gps_lat ) ) * cos( 弧度( com.gps_lon ) - 弧度(21.84803) ) + sin( 弧度(52.779716) ) * sin( 弧度( com.gps_lat ) ) ) ) 作为距离从美食类型作为 ct 左加入公司作为 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 回答