Java MySQL与入口关系的连接
我有一个MySQL表,如下所示:Java MySQL与入口关系的连接,java,mysql,Java,Mysql,我有一个MySQL表,如下所示: CREATE TABLE `objects` ( `id` INT NOT NULL, `foo` VARCHAR ( 32 ) NOT NULL, `bar` VARCHAR ( 32 ) NOT NULL, PRIMARY KEY ( `id` ) ); public class Obj { private final Set<Obj> relations = new HashSet<>(); // ..
CREATE TABLE `objects` (
`id` INT NOT NULL,
`foo` VARCHAR ( 32 ) NOT NULL,
`bar` VARCHAR ( 32 ) NOT NULL,
PRIMARY KEY ( `id` )
);
public class Obj {
private final Set<Obj> relations = new HashSet<>();
// ...
}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
多个对象之间可以有某些关系,如下表所示:
CREATE TABLE `relations` (
`id1` INT NOT NULL,
`id2` INT NOT NULL,
PRIMARY KEY ( `id1`, `id2` )
FOREIGN KEY ( `id1`, `id2` ) REFERENCES `objects` ( `id` ) ON DELETE CASCADE
);
如果两个对象彼此具有某种关系,则将一个条目放入关系
表中,其中id1
为第一个对象的id,id2
为第二个对象的id。现在我想加载对象及其与其他对象的关系,并将它们存储在Java对象中,如下所示:
CREATE TABLE `objects` (
`id` INT NOT NULL,
`foo` VARCHAR ( 32 ) NOT NULL,
`bar` VARCHAR ( 32 ) NOT NULL,
PRIMARY KEY ( `id` )
);
public class Obj {
private final Set<Obj> relations = new HashSet<>();
// ...
}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
但是,对于与id
匹配的id2
的任何关系
行,这只会选择给我id1
,但对于与id
匹配的关系
行,它不会给我id1
的id2
是否有可能以某种方式选择两者
示例:我在表格中输入了以下数据:
INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'hi', 'this' );
INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'is', 'an' );
INSERT INTO `objects` ( `foo`, `bar` ) VALUES ( 'example', 'row' );
INSERT INTO `relations` VALUES ( 1, 2 );
INSERT INTO `relations` VALUES ( 3, 1 );
当我现在从
objects
中选择id
为1的行时,我希望有一行具有id
、foo
、bar
,以及一个关系列表(应该是2和3)如果我理解正确,您希望选择所有相关的对象。这可以通过以下方式完成:
CREATE TABLE `objects` (
`id` INT NOT NULL,
`foo` VARCHAR ( 32 ) NOT NULL,
`bar` VARCHAR ( 32 ) NOT NULL,
PRIMARY KEY ( `id` )
);
public class Obj {
private final Set<Obj> relations = new HashSet<>();
// ...
}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
如果我理解正确,您希望选择所有相关对象。这可以通过以下方式完成:
CREATE TABLE `objects` (
`id` INT NOT NULL,
`foo` VARCHAR ( 32 ) NOT NULL,
`bar` VARCHAR ( 32 ) NOT NULL,
PRIMARY KEY ( `id` )
);
public class Obj {
private final Set<Obj> relations = new HashSet<>();
// ...
}
SELECT id1, o1.foo foo1, o1.bar bar1, id2, o2.foo foo2, o2.bar bar2
FROM `relations` r
JOIN `objects` o1 ON o1.id = r.id1
JOIN `objects` o2 ON o2.id = r.id2
如果只需要与特定id关联的记录,只需执行以下操作:
select *
from objects
where id in (
select max(id1, id2)
from relations
where min(id1, id2)='the desired id'
);
如果只需要与特定id关联的记录,只需执行以下操作:
select *
from objects
where id in (
select max(id1, id2)
from relations
where min(id1, id2)='the desired id'
);
你想得到什么?一个图形或仅仅是一个对象列表,在每个对象上都有一组其他对象?我的意思是,假设你的桌子上只有两个对象,它们之间有关系。在主函数中,创建第一个函数的obj(第一个)。。。如果您先执行.getOtherObjs().first().getOtherObjs().first(),您希望有一个指向原始对象的对象还是什么?假设有3个id为1、2、3的对象。1与关系表中注册的2和3相关,有两行:一行为
id1=1
和id2=2
,一行为id1=3
和id2
=1
。现在我想选择id为1的对象,并在一个查询中获得与对象2和3的关系。请注意,在一个关系中,对象1被放入id1
,而在另一个关系中,对象id被注册在id2
中。更新您的问题添加适当的数据样本和预期结果+由于所需对象的id可以在关系中的id1或id2中,您必须进行两次选择。您希望得到什么结果?一个图形或仅仅是一个对象列表,在每个对象上都有一组其他对象?我的意思是,假设你的桌子上只有两个对象,它们之间有关系。在主函数中,创建第一个函数的obj(第一个)。。。如果您先执行.getOtherObjs().first().getOtherObjs().first(),您希望有一个指向原始对象的对象还是什么?假设有3个id为1、2、3的对象。1与关系表中注册的2和3相关,有两行:一行为id1=1
和id2=2
,一行为id1=3
和id2
=1
。现在我想选择id为1的对象,并在一个查询中获得与对象2和3的关系。请注意,在一个关系中,对象1被放入id1
,而在另一个关系中,对象id被注册在id2
中。更新您的问题添加适当的数据样本和预期结果+,因为所需对象的id可以在关系中的id1或id2中,你必须做两个选择。如果我使用JOIN
或LEFT JOIN
以及是否添加groupby
是否重要?我只希望每个对象有一行作为最终结果,并将关系列表添加到该行中。当另一端可能为空时,需要左连接。由于id1和id2不为null,因此情况并非如此。如果您只想将相关对象添加到一个对象,只需添加一个where子句:where id1=XXX如果我使用JOIN
或LEFT JOIN
以及是否添加groupby
是否重要?我只希望每个对象有一行作为最终结果,并将关系列表添加到该行中。当另一端可能为空时,需要左连接。由于id1和id2不为null,因此情况并非如此。如果只希望相关对象与一个对象关联,只需添加where子句:where id1=XXX