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

qxsslcnc  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(353)

我是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'
h4cxqtbf

h4cxqtbf1#

在这种情况下,我们实际上会推荐join,只要在两个表中的连接列上都有适当的索引,那么通常应该更快。
即使使用子查询,您仍然需要这些相同的联接。
实际数据的大小和性质将影响性能,因此要确定您最好同时测试选项和测量结果。但是,请注意,随着表的增长,最佳查询可能会切换。

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\u id='$booking\u id'是唯一的,这是额外的3个查询,但是如果可能有多个条目,这可能会成倍增加并变得非常慢。
每一个额外的查询都会很快,没有网络开销,只有一行,希望匹配一个主键。所以,只要数量少,3个额外的查询就是名义上的性能。
一个连接将导致跨两个索引表的单个查询,这通常会缩短几毫秒。
子查询可能起作用的另一个示例是过滤结果,而不是向输出中添加额外的列。

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

根据订票id的典型列表有多大,将影响哪一个更有效。

相关问题