我有三个表 - p、m 和 i。 M是p和i的连接表,并且有一个距离属性来确定i距离p有多远。我想要做的是,如果尚未为前一个 p 选择 i,则为每个 p 选择所有 i。由于您不能仅对一列调用 select unique,因此我对我能做什么感到有点困惑。现在我的查询如下(希望仍然很容易理解,因为我试图让它变得有点模糊):
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;
基本上,我只希望 i 与 p 不更接近另一个 p (这将由 m.distance 确定)关联。有很多 i 项超过 30,我根本不想要那些。
我已经为此绞尽脑汁一个小时了。我非常感谢一些见解。
最佳答案
您可以使用 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 进行分组。 group by 将在 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
关于mysql - 仅当尚未选择时才从已连接的连接表中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30785470/