2015-04-14 144 views
0

我有如下表:結合多個MySQL查詢

id user_id recorded  latitude  longitude speed note_type details image_url       
1 10  3/29/2013 33.77701316 -84.39004377 -1  11  Test  2ecc2e36c3e1a512d349f9b407fb281e-2013-03-29-16-15-.. 

我試圖找到一種方法,以下查詢成一個完整的查詢會給我符合每一個人的查詢,所有記錄組合(各這些作品精細分開只是無法弄清楚如何將它們結合起來):

SELECT id, (3959 * acos(cos(radians(User_Input_Longitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(User_Input_Latitude)) + sin(radians(User_Input_Longitude)) * sin(radians(latitude)))) AS distance 
FROM note HAVING distance < User_Input_Distance 
ORDER BY distance LIMIT 0 , 1000 

SELECT details 
FROM note 
WHERE CHAR_LENGTH(details) > User_Input_CharacterLength 

SELECT DISTINCT details 
FROM note; 

SELECT DISTINCT image_url 
FROM note; 

所以基本上我需要一個比較基礎上,經度/緯度點至用戶定義的經度/緯度點和用戶定義的距離的距離查詢,檢查細節字段和字符的字符長度n最後只記錄具有不同數據的詳細信息和image_urls(很多image_urls和細節都留空,所以我一直在使用distinct來查找只有實際上有數據的用戶才能確定這是否是正確的方法) 。

就像我之前說過的,這些查詢中的每一個現在都單獨工作,但不幸的是我沒有足夠的技能在mySql中以智能方式組合它們。

對此的任何建議都會很好。

+0

對於初學者,'HAVING distance

+0

@lp_給出的答案涵蓋了構造MySQL查詢的正確方法。您可能還想考慮簡化'distance'子句,只需爲'bounding square'選擇一個(可能)稍大的結果集,然後在PHP中拒絕不符合更精確的極座標的結果。這樣可以減少CPU負載,並且還可以利用「經度」和「緯度」列上的索引,尤其是在表格很大的情況下。 HTH –

+0

@GavinJackson好點。只是稍微澄清一點:你說做一個更簡單的查詢檢查距離,基本上需要一個更大的區域,然後在我的PHP文件過濾器更接近減少負載。具有意義,因爲我認爲這個查詢在計算上會很昂貴。我的表格有大約1k條目,但是您怎麼說「利用經度和緯度列上的指標」? –

回答

1

儘管未提供架構,但似乎只有一個表。也許這就是你只想做:

SELECT id, (3959 * acos(cos(radians(User_Input_Longitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(User_Input_Latitude)) + sin(radians(User_Input_Longitude)) * sin(radians(latitude)))) AS distance, details, image_url 
FROM note 
WHERE (3959 * acos(cos(radians(User_Input_Longitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(User_Input_Latitude)) + sin(radians(User_Input_Longitude)) * sin(radians(latitude)))) < User_Input_Distance 
    AND CHAR_LENGTH(details) > User_Input_CharacterLength 
    AND (details IS NOT NULL AND details<>'') 
    AND (image_url IS NOT NULL AND image_url<>'') 
ORDER BY distance LIMIT 0, 1000 

一些注意事項:

  • 沒有group by子句中使用的having條款是不是真的使用條件查詢,通常是一個很好的方式,你應該使用where來代替(見下文)。
  • 你說,很多image_urldetails都是空的,你可以使用is not null來檢查它們是否爲NULL。如果您也想過濾空字符串,請添加例如details<>'' and image_url<>''去哪裏條件。
  • 該查詢將結合您的所有標準,因此它只會選擇所有匹配的記錄,如果這不是您想要的,您可以使用or來區分某些條件而不是它們的連詞。

[編輯]

MySQL的(如太標準SQL)不允許在WHERE條款(見manual)到列別名的引用。所以你要麼重複完整的表達式來計算distance或者使用HAVING子句(它應該在這裏產生相同的結果,但以一種稍微不同的方式)。

SELECT id, (3959 * acos(cos(radians(User_Input_Longitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(User_Input_Latitude)) + sin(radians(User_Input_Longitude)) * sin(radians(latitude)))) AS distance, details, image_url 
FROM note 
HAVING distance < User_Input_Distance 
    AND CHAR_LENGTH(details) > User_Input_CharacterLength 
    AND (details IS NOT NULL AND details<>'') 
    AND (image_url IS NOT NULL AND image_url<>'') 
ORDER BY distance LIMIT 0, 1000 

它的工作原理,因爲在HAVING你可以參考的別名,但使用它沒有GROUP BY,是不是一個真正的正確使用SQL的,它可能會影響性能了。你可以閱讀更多關於havingwhereherehere

+0

嘿謝謝,這看起來不錯。所有的東西都在一張桌子上,所以我不認爲我需要做任何加入。由於空字符串,NOT NULL也不起作用。所以你說要把(和細節<>'')作爲一個單獨的語句添加,或者只是與NOT NULL的同一行組合在一起?同樣在這種情況下,查詢出現的順序是否重要?如果距離第三或最後一次會出現什麼情況?當它是這樣寫的時候,它基本上是一個接一個地過濾嗎? –

+0

我用'<>'''檢查編輯查詢,[where子句](https://dev.mysql.com/doc/refman/5.7/en/select.html)'表示條件或條件,行必須滿足選擇',所以如果你指定更多的連接條件,RDBMS將選擇滿足所有條件的記錄。 –

+0

嘿,我在WHERE距離線上得到一個錯誤。它的說法距離並不是列名,這是真的。我刪除它,一切正常。 –