MySQL子查询奇怪问题

s2j5cfk0  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(113)

MySQL:5.7.16版本
有两个表:

  1. rule_conf表格:
CREATE TABLE `rule_conf`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` bigint(20) UNSIGNED NOT NULL,
  `app_log_id` bigint(20) UNSIGNED NOT NULL,
  `r_type` tinyint(2) UNSIGNED NOT NULL,
  `r_status` tinyint(2) UNSIGNED NOT NULL DEFAULT 0,
   ...
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `idx_app_log_id`(`app_log_id`) USING BTREE,
  INDEX `idx_app_id`(`app_id`) USING BTREE
) ENGINE = InnoDB

字符串

  1. app_log_conf表格:
CREATE TABLE `app_log_conf`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `app_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
   ...
  INDEX `idx_app_id`(`app_id`) USING BTREE
) ENGINE = InnoDB


有一个SQL:

select app_id from rule_conf
where app_log_id = (
   select max(id) from app_log_conf where app_id = 123 and r_status = 1 and r_type = 1
)


这个SQL返回一个空结果,而不是抛出一个错误,为什么?
在我的预期中,这个SQL应该抛出一个类似Unknown Column的异常,但它没有。
当我在子查询aaa = 1中添加一个条件,然后执行整体SQL时,我收到一个错误:1054 - Unknown column 'aaa' in 'where clause,这是我的预期,因为表app_log_conf实际上不包括列aaa
当我单独执行子查询时,我得到了一个错误:1054 - Unknown column 'r_status' in 'where clause,这也是我的期待。
是否有可能是因为主查询中的表'rule_conf'包含这些列?
所以,有人遇到过这样的问题,或者有人能解释一下为什么?
谁能解释一下为什么

qyyhg6bp

qyyhg6bp1#

子查询知道主查询的列。如果在主查询表和子查询表中有相同的列名,并且您不限定子查询中所需的列名,则子查询表的列优先于主查询表的列。因此,您的查询可以翻译为:

select rule_conf.app_id 
from rule_conf
where rule_conf.app_log_id = 
(
  select max(app_log_conf.id)
  from app_log_conf
  where app_log_conf.app_id = 123
  and rule_conf.r_status = 1
  and rule_conf.r_type = 1
);

字符串
当使用多个表时,应该用它们的表限定所有列名,以避免错误。使用别名表名有助于实现这一点。
子查询知道主查询的列有时是必要的,当我们想要写一个相关的子查询时,例如。

select rc.app_id 
from rule_conf rc
where rc.app_log_id = 
(
  select max(alc.id)
  from app_log_conf alc
  where alc.app_id = rc.app_id
);

相关问题