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

标签 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'

最佳答案

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

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

实际数据的大小和性质会影响性能,因此您最好对这两个选项都进行测试并衡量结果。但是请注意,随着表的增长,最佳查询可能会发生变化。

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 的典型列表有多大将影响哪个更有效。

关于mysql - 如何将左连接转换为子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52961725/

相关文章:

mysql - 为什么 Mysql 查询返回 OK,当它预期从减法中得到负 INT 时?

mysql - 使用 SQL 根据结果排序操作中的位置批量更新列?

mysql - 在 Ubuntu 14.04 上安装 mysqldump

php - 从网页上的 mysql 结果下载文件

mysql - 独特的案例陈述

mysql - 如何从 varchar 类型值中选择最大数量

mysql - if else 在 mysql 查询中

mysql - SQL - 在一个案例中计算两个字段

php - 遍历 $_POST 变量

php - 从 Laravel 中的一系列日期获取行