mysql子查询在where in子句中

Posted

技术标签:

【中文标题】mysql子查询在where in子句中【英文标题】:mysql subquery in where in clause 【发布时间】:2020-10-13 07:55:51 【问题描述】:

我执行 Query A,它给了我结果,即 4,5,6。如果我直接在 WHERE IN 子句中的 Query B 中使用该结果,它会再次给我完美的结果。但如果我同时使用 Query C 中组合的查询,它不会生成任何答案。

查询 A

SELECT `region`.`district_id` 
FROM `region` 
LEFT JOIN `regional_owner` ON `regional_owner`.`r_id` = `region`.`id`
WHERE `regional_owner`.`email_id` = 'balajibarhate10@gmail.com';

产生 O/P - 4,5,6 我在下面使用

查询 B

SELECT sum(`purchase`.`purchase_ammount`), `franchise`.`district_id`
FROM `purchase`
LEFT JOIN `franchise` ON `franchise`.`id` = `purchase`.`f_id`
WHERE `franchise`.`district_id` in ( 
         4,5,6
    )
    AND purchase.purchase_date BETWEEN Date_format(CURDATE(), "%Y-%m-01") AND CURDATE()
GROUP BY `franchise`.`district_id`

现在,我将上述两个查询合二为一,如下所示

查询 C

SELECT sum(`purchase`.`purchase_ammount`), `franchise`.`district_id`
FROM `purchase`
LEFT JOIN `franchise` ON `franchise`.`id` = `purchase`.`f_id`
WHERE `franchise`.`district_id` in ( 
    SELECT `region`.`district_id` 
    FROM `region` 
    LEFT JOIN `regional_owner` ON `regional_owner`.`r_id` = `region`.`id`
    WHERE `regional_owner`.`email_id` = 'balajibarhate10@gmail.com'
)

AND purchase.purchase_date BETWEEN Date_format(CURDATE(), "%Y-%m-01") AND CURDATE()
GROUP BY `franchise`.`district_id`

我无法理解,哪一部分是错误的。请指导我。

【问题讨论】:

您在查询 a 中使用(内部)联接,但在 c 中的子查询中使用左联接。 在查询 A 中,您选择了两列 (region.district_id)。当您将此查询用作查询 C 中的子查询时,请尝试仅选择一列 (district_id)。 @mti2935 它不是两列。它是一个带有列名的表。 @P.Salmon 我没听懂你。你能解释一下吗 我现在明白了。我以为是,,但它是.,是时候换新眼镜了。 【参考方案1】:

你的左连接没有什么意义;你左连接一个表,然后在 WHERE 子句中使用该表,消除左连接引入的任何空值,有效地将其转换为内连接

这也是编写查询的一种更简单的方法:

SELECT sum(`purchase`.`purchase_ammount`), `franchise`.`district_id`

FROM `purchase`
JOIN `franchise` ON `franchise`.`id` = `purchase`.`f_id`
JOIN `region` ON `region`.`district_id` = `franchise`.`district_id`
JOIN `regional_owner` ON `regional_owner`.`r_id` = `region`.`id`
    
WHERE
  `purchase`.`purchase_date` BETWEEN date_sub(curdate(),interval DAY(@date)-1 DAY) AND curdate() AND
 `regional_owner`.`email_id` = 'balajibarhate10@gmail.com'
GROUP BY `franchise`.`district_id`

如果您没有得到任何结果,我会先注释掉 date 子句。还要注意 BETWEEN 是包容性的,并且在处理日期时间时可能会很尴尬,因为 BETWEEN 2000-01-01 and 2000-01-31 错过了发生在例如200-01-31 12:34:56,即使它们也发生在 1 月.. 使用 >=< 进行日期范围通常会更好,除非您确定日期是离散的(没有时间)

【讨论】:

我按照你的要求做了。两种方式都行不通。我使用 select CAST(region.district_id AS SIGNED) 进行铸造。它现在生成 o/p。但是现在有一个小问题。它只是拿了第一个没有,即 4。它以某种方式离开了 5 和 6。我怎样才能使用所有三个不。使用转换为整数? 为了调试这类问题,你真的需要开始删除一些东西,比如 where 子句或连接;只需将其设为 SELECT *,然后开始注释内容,直到获得所需的结果数量,然后您就知道哪个部分有问题。我将从 where 中的日期子句开始。您没有提供任何示例数据,所以我无法告诉您更多信息。如果您在特许经营和地区中的 district_id 数据类型是不同的类型,那么这确实表明您的数据模型存在错误。你不应该每次加入时都投射东西......

以上是关于mysql子查询在where in子句中的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:在 WHERE 子句中带有 NOT IN 的从属子查询非常慢

SQL 中 where 后面可不可以跟上子查询

Mysql在where子句中优化子查询

mysql_数据查询_嵌套查询

在 MySQL 查询的 WHERE 子句中使用列别名会产生错误

MySQL 子查询用法和注意事项