2015-06-11 61 views
0

我有三個表格 - p,m和i。 M是p和i的連接表,並且具有距離屬性以確定我距離p有多遠。我想要做的就是爲每個p選擇我所有的p,如果它還沒有被選爲前一個p。既然你不能只爲一列調用select distinct,我對於我能做的事情有些困惑。現在我的查詢如下(希望仍然很容易跟着我試圖讓它有點含糊):只有在尚未選擇連接的連接表時才進行選擇

select p.id, p.name, m.distance, i.id from p join m on p.id=m.p_id join i on m.i_id=i.id where m.distance <= 30 order by p.name; 

基本上,我只希望我相關聯的p如果它不是更接近另一P(這將由m.distance確定)。有很多我的項目超過30,我根本不需要這些。

現在一直在我的頭上反抗了一個小時。我非常感謝一些見解。

回答

1

您可以通過i.id使用一個組,以便在結果中具有此列的不同值。

但首先,要確保你得到與給p最小距離的我,我會建議你首先做一個選擇和秩序的距離是這樣的:

select p.id, p.name, m.distance, i.id 
from p join m on p.id=m.p_id join i on m.i_id=i.id 
where m.distance <= 30 order by m.distance asc 

這以前的查詢將返回所有連接到P的Is按從最小到最大的距離排序。

然後你可以對前一個查詢返回的結果和i.id組進行選擇。如果存在多個i.id,該組將按照i.id列的不同顯示,它將返回找到的第一行(最小):

select * from (select p.id, p.name as p_name, m.distance, i.id as idOfI 
from p join m on p.id=m.p_id join i on m.i_id=i.id 
where m.distance <= 30 order by m.distance asc) as ordredIs 
group by idOfI 
order by p_name 
+0

謝謝。我只是想通了,來到這裏檢查我是否準確,並得到了相同的答案。我還選擇min(distance)作爲我的外部查詢的距離,以確保mysql在多個時選擇最接近的i。從我閱讀的內容來看,當你使用一個組時,它有時可以隨機選擇一個,我想確保它沒有。也許我錯了,這是對SQL的浪費,但它解決了我的問題。感謝您的答覆。 – Skyline969