如何将左联接转换为子查询?

时间:2018-10-24 05:40:13

标签: mysql

我是mysql的初学者,我已经通过使用左连接获取查询中提到的列来编写查询,我想将该查询转换为子查询,请帮帮我。

SELECT b.service_status,
       s.b2b_acpt_flag,
       b2b.b2b_check_in_report,
       b2b.b2b_swap_flag
FROM user_booking_tb AS b
LEFT JOIN b2b.b2b_booking_tbl AS b2b ON b.booking_id=b2b.gb_booking_id
LEFT JOIN b2b.b2b_status AS s ON b2b.b2b_booking_id = s.b2b_booking_id
WHERE b.booking_id='$booking_id'

1 个答案:

答案 0 :(得分:3)

在这种情况下,实际上建议使用连接,只要您在两个表的连接列上都有适当的索引,通常应该更快。

即使有子查询,您仍然需要相同的联接。

实际数据的大小和性质会影响性能,因此请务必确定最好同时测试两个选项和衡量结果。但是请注意,随着表的增长,最佳查询可能会切换。

SELECT b.service_status,
      (SELECT b2b_acpt_flag FROM b2b_status WHERE b.booking_id=b2b_booking_id)as b2b_acpt_flag,
      (SELECT b2b_check_in_report FROM b2b_booking_tbl  WHERE b.booking_id=gb_booking_id) as b2b_check_in_report,
      (SELECT b2b_check_in_report FROM b2b_booking_tbl  WHERE b.booking_id=gb_booking_id) as b2b_swap_flag
FROM user_booking_tb AS b
WHERE b.booking_id='$booking_id'

要深入研究此查询的工作方式,您将对主查询返回的每一行有效地执行3个附加查询。 如果b.booking_id ='$ booking_id'是唯一的,则这是额外的3个查询,但是如果可能有多个条目,则这可能会成倍增加并变得很慢。

这些额外的查询中的每一个都将是快速的,没有网络开销的,单行的,希望能与主键匹配。因此,只要数量少,额外的3个查询就是名义性能。

一次连接将导致对2个索引表的查询,这通常会节省几毫秒的时间。

子查询可能起作用的另一个实例是您过滤结果而不是在输出中添加额外的列。

SELECT b.*
FROM user_booking_tb AS b
WHERE b.booking_id in (SELECT booking_id FROM othertable WHERE this=this and that=that)

取决于booking_id的典型列表的大小将影响哪个更为有效。