仅在尚未选择的情况下从已连接的连接表中进行选择

时间:2015-06-11 15:44:10

标签: mysql

我有三张桌子 - p,m和i。 M是p和i的连接表,并且具有距离属性以确定i与p的距离。我想要做的是,如果尚未为之前的p选择了,则为每个p选择所有i。由于你不能只为一列调用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(由m.distance确定),我只希望我与p相关联。有很多项目超过30项,我根本不需要这些项目。

现在已经打了一个小时。我非常感谢你的一些见解。

1 个答案:

答案 0 :(得分:1)

您可以使用i.id组,以便在结果中包含此列的不同值。

但首先,为了确保你获得与p的距离最小的i,我建议你先做一个选择并按距离订购:

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,则group by将作为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