mySQL子查询 - 如果可能的话,单次传递

时间:2013-10-04 08:44:37

标签: mysql subquery

我希望执行一个查询,它将从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)

3 个答案:

答案 0 :(得分:0)

只有当您的子查询返回一行时,您才能实现的目标。 例如这里

    (SELECT subfield_1 FROM tableb     WHERE subfield_id = field_3) 

字段3应该是tableb的主键

答案 1 :(得分:0)

使用JOIN s。取决于field_3field_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_3field_4上有索引

这是 SQLFiddle 演示

答案 2 :(得分:0)

您可以执行outer join,您将看到相同的结果,而不必延迟使用correlated subquery

外部联接的优势在于,无论tablea子查询中是否存在附带值,都将显示tableb中的所有行。

正常连接只返回所有三个表包含field_3field_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;