mysql子查询中的where in子句

时间:2020-06-23 09:34:00

标签: mysql sql database

我执行查询A ,它会给我结果4,5,6。而且,如果我直接在WHERE IN子句中的查询B 中使用该结果,它将再次为我提供理想的结果。但是,如果我同时使用查询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`

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

1 个答案:

答案 0 :(得分:0)

您的左联接没有多大意义;您离开了联接表,然后在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,即使它们也发生在一月。.最好使用>=<进行日期范围调整,除非您确定日期是离散的(否次)