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 的从属子查询非常慢