【问题标题】:mysql query inner join on same table with different conditionsmysql在具有不同条件的同一张表上查询内部连接
【发布时间】:2014-01-05 00:00:50
【问题描述】:

我有一个表交易,我试图找出给定月份的新客户。这意味着如果客户在当月之前的时间内没有交易,他/她将被视为新客户。

我已经找到了一种方法,但它的效率非常低,而且需要很长时间。然后我遇到了这个artikel,它比较了不同的方法。我试图将这种方法调整为我的方法,但没有成功。

可视化我的问题:

|--------------------------- time period with all transactions -----------------------|
|----- period before month transactions = 0) ---|---- curr month transactions > 0 ----|

表格如下所示:

transactions
id, email, state, date_paid

我的查询:

SELECT
    l.email
FROM
    transactions as l
LEFT JOIN transactions as r ON r.email = l.email
WHERE
    r.email IS NULL
AND l.state = 'paid'
AND r.state = 'paid'
AND l.date_paid <= '2013-12-31 23:59:59'
AND r.date_paid < '2013-12-01 00:00:00'

我做错了什么?

【问题讨论】:

    标签: mysql sql select left-join where-clause


    【解决方案1】:

    试试这个:

    SELECT l.email
    FROM transactions AS l
    LEFT JOIN transactions AS r ON r.email = l.email AND r.state = 'paid' AND r.date_paid < '2013-12-01 00:00:00'
    WHERE r.email IS NULL AND l.state = 'paid' AND l.date_paid <= '2013-12-31 23:59:59'
    

    【讨论】:

    • 谢谢你的答案。我尝试了两种方法,你的方法快了很多。我可以为 l.email 输入 DISTINCT 条件或 GROUPED 条件吗?如果可以,具体在哪里。不想打断查询:)
    【解决方案2】:

    试试这个:

    SELECT l.email
    FROM transactions l
    WHERE NOT l.email IN (SELECT r.email 
                          FROM transactions r
                          WHERE r.state = 'paid' AND r.date_paid < '2013-12-01 00:00:00')
          AND l.state = 'paid' AND l.date_paid <= '2013-12-31 23:59:59'
    

    【讨论】: