我执行查询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`
我无法理解,哪一部分是错误的。请引导我。
答案 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,即使它们也发生在一月。.最好使用>=
和<
进行日期范围调整,除非您确定日期是离散的(否次)