提问者:小点点

MySQL不同的或组通过在组合有没有给出一个结果时,结果是一个单一的行


看来我的查询并不是我想要的。只要结果是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左加入。有距离的名字


共1个答案

匿名用户

试试这个:

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;