2015-06-11 59 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