mysql - 仅当尚未选择时才从已连接的连接表中进行选择

标签 mysql

我有三个表 - 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/

相关文章:

javascript - Node.js Sequelize ManyToMany 关系产生不正确的 SQL

不再支持复合键上的 MySQL auto_increment?

java.sql.SQLException : Access denied for user 'root' @'localhost' (using password: YES)

mysql - 如何在多对多电影和 Actor 关系中选择具有五个或更多 Actor 的所有电影?

php - 使用 phpseclib 将 mysql gzipped 备份下载到本地系统

mysql - 如何从第二个表(MYSQL)的更新中获取表值

MYSQL 计算列中特定事件的平均值

java - 在 JAVA 中使用 JDBC 在单个查询中将多行插入到两个表中

php - 关于唯一用户名

类似mysql的查询