我希望执行一个查询,它将从mySQL中的许多表中返回数据,这些表需要一些子查询,但是我不确定我想要实现的是否只能在一次传递中实现。
我以下面的例子(我知道这不起作用但是给你的想法)
SELECT field_id, field_1,
(SELECT subfield_1 FROM tableb WHERE subfield_id = field_3) AS field_a,
(SELECT subfield_1 FROM tableb WHERE subfield_id = field_4) as field_b
FROM tablea WHERE field_2 = 123
这将根据主表中的2个不同列从第二个表中提取2个条目。
tablea
----------
field_id, bigint
field_1, varchar(50)
field_2, int
field_3, bigint
field_4, bigint
tableb
----------
subfield_id, bigint
subfield_1, varchar(50)
答案 0 :(得分:0)
只有当您的子查询返回一行时,您才能实现的目标。 例如这里
(SELECT subfield_1 FROM tableb WHERE subfield_id = field_3)
字段3应该是tableb的主键
答案 1 :(得分:0)
使用JOIN
s。取决于field_3
和field_4
是否NULL
能够使用LEFT JOIN
(如下例所示)或INNER JOIN
SELECT field_id, field_1, b1.subfield_1 field_a, b2.subfield_1 field_b
FROM tablea a LEFT JOIN tableb b1
ON a.field_3 = b1.subfield_id LEFT JOIN tableb b2
ON a.field_4 = b2.subfield_id
WHERE a.field_2 = 123
示例输出:
| FIELD_ID | FIELD_1 | FIELD_A | FIELD_B | |----------|---------|-----------|-----------| | 1 | 11 | subvalue1 | subvalue5 | | 2 | 22 | subvalue4 | subvalue2 | | 3 | 33 | subvalue2 | (null) |
注意:确保您在field_3
和field_4
上有索引
这是 SQLFiddle 演示
答案 2 :(得分:0)
您可以执行outer join
,您将看到相同的结果,而不必延迟使用correlated subquery
。
外部联接的优势在于,无论tablea
子查询中是否存在附带值,都将显示tableb
中的所有行。
正常连接只返回所有三个表包含field_3
和field_4
的行,因此不会返回field_id = 3的行。
示例:强>
SELECT field_id,
field_1,
s1.subfield_1 as field_a,
s2.subfield_1 as field_b
FROM tablea AS a
LEFT JOIN tableb AS s1 ON a.field_3 = s1.subfield_id
LEFT JOIN tableb AS s2 ON a.field_4 = s2.subfield_id
WHERE field_2 = 123;