Mysql SQL获取所有联接元素,通过联接表指定联接实体
我试图通过一个相关行指定实体,将所有相关行都指定给一个实体Mysql SQL获取所有联接元素,通过联接表指定联接实体,mysql,sql,Mysql,Sql,我试图通过一个相关行指定实体,将所有相关行都指定给一个实体 CREATE TABLE entity ( id INTEGER PRIMARY KEY ) CREATE TABLE related ( id INTEGER PRIMARY KEY key VARCHAR(32) UNIQUE NOT NULL entity_id INTEGER FOREIGN KEY (`entity.id`) ) 我想要一个特定实体的所有相关行,但我不确定如何进行连接,我总是
CREATE TABLE entity (
id INTEGER PRIMARY KEY
)
CREATE TABLE related (
id INTEGER PRIMARY KEY
key VARCHAR(32) UNIQUE NOT NULL
entity_id INTEGER FOREIGN KEY (`entity.id`)
)
我想要一个特定实体的所有相关行,但我不确定如何进行连接,我总是只得到与我用来取消引用的键相关的行
SELECT
*
FROM
entity e,
related r
JOIN
related r1
WHERE
e.id = r.entity_id
AND r.key= 'lookup key'
AND r1.entity_id = e.id;
所以如果我执行
INSERT INTO entity VALUES (1, 2);
INSERT INTO related VALUES (1, 'lookup key' 1),
(2, 'other key' 1),
(3, 'another key' 1),
(4, 'this key' 2),
(5, 'that key' 2),
(6, 'their key' 2);
我想要
entity.id related.id related.key related.entity_id
1 1 lookup key 1
1 2 other key 1
1 3 another key 1
但我总是会
entity.id related.id related.key related.entity_id
1 1 lookup key 1
我不想要这个
entity.id related.id related.key related.entity_id
1 1 lookup key 1
1 2 other key 1
1 3 another key 1
2 4 this key 2
2 5 that key 2
2 6 their key 2
我知道SQL不是100%正确的。如果您想要所有键值,为什么要对键进行筛选?然后,从你所说的,你似乎想要一个简单的连接:
从逻辑上讲,您真正想要做的是通过id约束实体,因此有几种不同的方法来实现这一点,但我认为a背后的语法和思想是最清晰的方法之一
SELECT
*
FROM
entity e,
JOIN
related r
WHERE
r.entity_id = e.entity_id
AND e.entity_id IN (SELECT entity_id FROM related WHERE key = 'lookup key')
我按键进行筛选,因为我不想要所有实体行,我只想要该键所属的实体行,以及该实体的所有其他相关行编辑您的问题并提供示例数据和所需结果。@GordonLinoff我做了一些更改,使问题更加完整建议的行,出于性能原因,我试图避免使用子查询。您可以在答案中添加其他技术之一吗?如果索引正确,则此查询不会受到性能损失。您应该使用explain extended format=json来确定这类事情以及时间安排,而不是假设您了解数据库将要做什么以及性能如何。假设索引的键,以及外键当然。
SELECT
*
FROM
entity e,
JOIN
related r
WHERE
r.entity_id = e.entity_id
AND e.entity_id IN (SELECT entity_id FROM related WHERE key = 'lookup key')