2013-02-20 51 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