2013-02-20 52 views
1

似乎我的查询不完全按照我想要的。只要结果是2行或更多行,查询就会得到结果。当我得到单行时,查询没有得到任何结果。MySQL独特或组合与结果是单行时没有给出结果

SELECT我可以做DISTINCT (ct.name)但这给出了同样的问题,作为群。

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 

在这里,我检查,如果该公司的距离内的用户preferenced搜索半径

HAVING distance < 20; 

为例如,如果我将“快餐”,“纯素食”和“健康”作为美食类型,则无论搜索距离中有多少公司与该美食类型相关,我只需要其中一种烹饪类型。所以我使用GROUP BY过滤了双重美食类型,希望这有助于理解我在此查询中的方法。

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

完整的SQL查询到这里

SELECT ct.name,(3959个* ACOS(COS(弧度(52.779716))* COS( 弧度(com.gps_lat))* COS(弧度( (弧度(52.779716))* sin(弧度( com.gps_lat))))作为距离FROM cuisine_types作为ct LEFT JOIN 公司AS com ON(com.cuisine_type_id = -) ct.id)GROUP BY ct.name HAVING距离< 20;

+0

它没有在所有的或错误的结果给出的结果? – 2013-02-20 22:27:22

+0

当结果为1行时,没有结果可见(我知道应该有一个结果) – 2013-02-20 22:29:21

+0

如果您摆脱Group By和Having,您的单行是否会出现? – Tony 2013-02-20 22:33:31

回答

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; 
+0

“MIN”聚合函数(距离表达式附近)的添加使查询具有确定性。如果没有“MIN”函数(如在OP查询中),MySQL可以自由地从'com'中选择任意一行,并且如果这一行恰好导致大于20的“距离”结果,那么MySQL将会不返回一排。 – spencer7593 2013-02-20 22:57:43

+0

这是真的,但是当'HAVING'中只有一行被选中并且'distance'小于20时,MySQL也不会返回它。 – 2013-02-20 23:17:32

+0

@ChrisSmits在我的测试中使用MIN作品。你能发布一些样本数据吗? – Tony 2013-02-22 17:06:19