2012-07-17 58 views
0

我有多對由用戶輸入(php)計算的笛卡爾座標(X,Y),它們構成一個範圍(圖片是一個多邊形)。SQL選擇數據與多列匹配的行

從我的數據庫(600分)中,我需要找到任何落在該範圍內(在多邊形內)的點,並排除任何超出該範圍的點。

我想在一個SQL語句中完成所有操作,但我似乎無法理解匹配同一行的兩個不同列的邏輯。

我想我拆分兩個表之間的數據並使用內部連接?但是這似乎有點過分了。我嘗試玩MYSQL的幾何部分(嘗試使用「點」數據類型搜索座標對),但我看不到我已經導入的數據(成功導入後)。當我從一行中選擇所有數據時,嘗試顯示$ row [「coords」](這應該是點數據),我得到的只是一串奇怪的ASCII字符和正方形...

所以希望有是使用常規SQL執行此操作的簡單方法。

+0

作爲提示:您可以自行加入表格,它可以在SQL中使用。 – 2012-07-17 06:22:47

回答

1

讓說,你有臺這樣的:

TABLE_1:

ID  | INT 
X_POS | INT 
Y_POS | INT 

ID - 自動增量主鍵 X_POS - 點 Y_POS的X座標 - 點的Y座標

現在你有這些樣品數據:

ID | X_POS | Y_POS 
1 | 3.25 | 1.75 
2 |-0.5 | 2.17 

等。

現在,你要選擇其中一點是在X軸-1.34和1.28 之間和Y軸-5.63 and0.98

之間的所有行

您查詢應儘可能如下:

SELECT * FROM TABLE_1 
WHERE 
(X_POS BETWEEN -1.34 AND 1.28) AND 
(Y_POS BETWEEN -5.63 AND 0.98) 

您可以測試這個樣本這裏:SQLFIDDLE

UPDATE:

你絕對應該使用MySQL Spatial Extension

我試圖與MYSQL的幾何部分打(試圖尋找使用「點」數據類型 座標對),但我看不到我 已導入

數據

請提供關於您的表(SHOW CREATE TABLE)和您用於導入數據的方式的更多詳細信息。

然後我可以幫你。

+0

謝謝,我認爲這將起作用。這基本上是我所擁有的,但沒有AND語句之間的括號,所以我得到了一些粗俗的結果。我的(缺乏)SQL語法一直是問題:) – 3030 2012-07-17 04:23:49

+0

再次。我會明天測試,但我很確定它不會工作。這是我的陳述(但沒有括號)。問題是,如果多邊形是正方形,那麼代碼就很好,但是它是不規則的多邊形(鑽石)。所以我用這個代碼得到一些粗糙的結果,例如:一個點可能在X軸(最小 - 最大)和Y軸(最小 - 最大)之間,但實際在真正的多邊形之外。我想我需要徹底重新思考我的邏輯。 – 3030 2012-07-17 04:41:00

+0

再次嗨。只是爲了說清楚。我從用戶輸入[x = 10,y = 10] [x = 10,y = 20] [x = 15,y = 15] [x = 5,y = 5]得到4組座標。我需要將它們分成兩組,分別是X_max,X_min和Y_max,Y_min。然後測試數據庫的每一行。所以如果一個點(在db中)的X值在X_max和X_min之間,那麼該點的Y值必須在Y_max和Y_min之間。這是適用於正方形的邏輯,但不適用於不規則多邊形。目前我認爲解決方案是根據計算出的向量在php中添加一個額外的測試到SQL結果。如果CALC_VECTOR介於.. – 3030 2012-07-17 05:00:45