有人可以通过where子句中的简单子查询来帮助我解决这个问题吗?

时间:2013-10-28 06:32:15

标签: mysql subquery logical-operators

描述:我们希望了解特定月份的一些客户购买习惯模式。 我们担心从6个月前开始的三个月内向客户销售图书并延长两个月。

我需要帮助解决此问题 - 问题:显示所讨论的三个月中正好一个月内购买的所有客户的客户ID和名称。例如,客户可能会在第二个月进行购买,但不会在第一个月或第三个月进行购买。

回答类似问题:显示所讨论的任何月份内没有购买的客户的客户ID和名称。

set @rundate = current_date;
set @Mnth_1 = DATE_SUB(@rundate,  INTERVAL 6 MONTH);
set @Mnth_2 = DATE_SUB(@rundate,  INTERVAL 5 MONTH);
set @Mnth_3 = DATE_SUB(@rundate,  INTERVAL 4 MONTH);
Select Distinct c_id, c_name
From a_bkorders.bkv_CustOrders
Where order_id Not IN (
    Select order_id
    From a_bkorders.bkv_CustOrders
    Where Date_format(order_date, '%M %Y') = Date_format(@Mnth_1, '%M %Y'))
and order_id Not IN (
    Select order_id
    From a_bkorders.bkv_CustOrders
    Where Date_format(order_date, '%M %Y') = Date_format(@Mnth_2, '%M %Y'))
and order_id Not IN (
    Select order_id
    From a_bkorders.bkv_CustOrders
    Where Date_format(order_date, '%M %Y') = Date_format(@Mnth_3, '%M %Y'));

2 个答案:

答案 0 :(得分:0)

试试这个我不确定但可能适合你。

set @rundate = current_date;
set @Mnth_1 = DATE_SUB(@rundate,  INTERVAL 6 MONTH);
set @Mnth_2 = DATE_SUB(@rundate,  INTERVAL 5 MONTH);
set @Mnth_3 = DATE_SUB(@rundate,  INTERVAL 4 MONTH);
Select Distinct c_id, c_name
From a_bkorders.bkv_CustOrders
Where order_id Not IN (
    Select order_id
    From a_bkorders.bkv_CustOrders
    Where Date_format(order_date, '%M %Y') = Date_format(@Mnth_1, '%M %Y') and Date_format(order_date, '%M %Y') = Date_format(@Mnth_2, '%M %Y') and Date_format(order_date, '%M %Y') = Date_format(@Mnth_3, '%M %Y') )

答案 1 :(得分:0)

因此,如果您需要一段时间,您可以使用BETWEEN构造。另外我认为最好使用AND NOT EXISTS然后NOT IN


Select Distinct c_id, c_name
From a_bkorders.bkv_CustOrders
Where order_id NOT IN (
 Select order_id
 From a_bkorders.bkv_CustOrders
 Where order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
)