我有一个 MySQL 表如下:
CREATE TABLE `objects` (
`id` INT NOT NULL,
`foo` VARCHAR ( 32 ) NOT NULL,
`bar` VARCHAR ( 32 ) NOT NULL,
PRIMARY KEY ( `id` )
);
多个对象之间可以有一定的关系,如下表所示:
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
);
如果两个对象彼此有某种关系,一个条目被放入relations
表 id1
作为第一个对象的 ID 和 id2
作为第二个对象的 id。现在我想加载对象及其与其他对象的关系,并将它们存储在如下所示的 Java 对象中:
public class Obj {
private final Set<Obj> relations = new HashSet<>();
// ...
}
我正在寻找一种方法来正确加载与 JOIN 的关系,它选择了 id2
。来自具有匹配 id
的所有行/id1
和 id1
来自具有匹配 id
的所有行/id2
.
我可以使用以下查询:
SELECT `objects`.*, GROUP_CONCAT(`relations`.`id1`) AS `id1`
FROM `objects`
LEFT JOIN `relations`
ON `objects`.`id` = `relations`.`id2`
GROUP BY `objects`.`id`;
但是,这只会选择给我 id1
用于任何 relations
与 id2
排在一起匹配id
, 但它不会给我 id2
用于 relations
带有 id1
的行匹配id
.
是否有可能以某种方式同时选择它们?
示例:我在表格中输入了以下数据:
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
的 one 行, foo
, bar
, 和一个关系列表(应该是 2 和 3)
最佳答案
如果我没理解错的话,您想要选择所有相关对象。这可以按如下方式完成:
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
关于java - 具有条目关系的 MySQL JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995253/