看来我的查询并不是我想要的。只要结果是2行或更多行,查询就会得到一个结果。当我得到一行时,查询没有得到任何结果。
在选择中
我可以执行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行或更多行时才起作用。。。
GROUP BY ct.name
在这里,我检查公司的距离是否在用户首选的搜索半径内
HAVING distance < 20;
例如,如果我有“快餐”、“素食主义者”和“健康”作为烹饪类型,那么无论搜索距离中有多少家公司与该烹饪类型相关,我只想要每种烹饪类型中的一种。因此,我使用GROUP BY过滤掉了双重烹饪类型,我希望这有助于理解我在这个查询中的方法。
注意:一家公司只有一种烹饪类型。
没有注释的完整sql查询
选择ct。名称,(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)))作为与烹饪类型的距离,作为ct左,作为com在(com.courine_-type_-id=ct.id)组上的公司,由ct左加入。有距离的名字
试试这个:
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;