不同条件下同一表上的mysql查询内部联接

不同条件下同一表上的mysql查询内部联接,mysql,sql,select,left-join,where-clause,Mysql,Sql,Select,Left Join,Where Clause,我有一个交易表,我试图找出一个月内我们的新客户。这意味着,如果客户在当月之前没有交易,他/她将被视为新客户 我已经想出了一个办法,但它效率很低,而且需要很长时间。然后我遇到了这个比较不同方法的例子。我试图将这种方法调整到我的方法,但没有成功 想象一下我的问题: |--------------------------- time period with all transactions -----------------------| |----- period before month tran

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

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

想象一下我的问题:

|--------------------------- 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'
我做错了什么

试试这个:

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'
试试这个:

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'

谢谢你的回答。我两种方法都试过了,你的速度快了很多。我可以为l.email设置一个不同的条件或分组,如果是,具体在哪里。不想打断查询: