我有三张桌子 - 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项,我根本不需要这些项目。
现在已经打了一个小时。我非常感谢你的一些见解。
答案 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