0
SELECT * 
FROM users
WHERE id
IN ( 2024 ) 
AND id NOT IN (
    SELECT user_id
    FROM  `used` 
    WHERE DATE_SUB( DATE_ADD( CURDATE( ) , INTERVAL 7 DAY ) , INTERVAL 14 DAY ) <= created)
AND id NOT IN (
    SELECT user_id
    FROM coupon_used
    WHERE code =  'XXXXX')
AND id IN (
    SELECT user_id
    FROM accounts)

我在 users 表中有 id 2024,但是这个 id 2024 在 used 表中。因此,当我运行此查询时,它也会显示 2024 id,应该将其过滤掉。我在选择特定用户的地方运行查询,然后我希望这些用户被过滤掉,他们不应该在使用的表中。但上面的查询并没有给我想要的结果。期望结果是我想通过以下条件选择用户: 选择特定用户,并检查他们是否不在 used 表中,也不在 coupon_used 表中,但它们应该在 accounts 表中。

4

3 回答 3

1

首先,使用连接尝试这样的事情。哪个应该更容易阅读并且(取决于 MySQL 的版本)更快

SELECT DISTINCT users.* 
FROM users
INNER JOIN accounts ON users.id = accounts.user_id
LEFT OUTER JOIN coupon_used ON users.id = coupon_used.user_id AND coupon_used.code = 'XXXXX'
LEFT OUTER JOIN `used` ON users.id = `used`.user_id AND DATE_SUB( DATE_ADD( CURDATE( ) , INTERVAL 7 DAY ) , INTERVAL 14 DAY ) <= `used`.created
WHERE id IN ( 2024 ) 
AND coupon_used.user_id IS NULL
AND `used`.user_id IS NULL

编辑 - 简化日期检查: -

SELECT DISTINCT users.* 
FROM users
INNER JOIN accounts ON users.id = accounts.user_id
LEFT OUTER JOIN coupon_used ON users.id = coupon_used.user_id AND coupon_used.code = 'XXXXX'
LEFT OUTER JOIN `used` ON users.id = `used`.user_id AND DATE_SUB( CURDATE( ) , INTERVAL 7 DAY ) <= `used`.created
WHERE id IN ( 2024 ) 
AND coupon_used.user_id IS NULL
AND `used`.user_id IS NULL
于 2013-03-20T13:29:36.663 回答
1

我会为排除条件使用左连接,对包含项使用常规连接:

SELECT users.*
FROM users
INNER JOIN accounts ON accounts.user_id = users.id
LEFT JOIN used ON used.user_id = users.id AND DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= used.created)
LEFT JOIN coupon_used ON coupon_used.user_id = users.id AND coupon_used.code = 'XXXX'
WHERE id IN (2024) AND used.user_id IS NULL AND coupon_used.user_id IS NULL

我也编辑了日期操作;+7 -14 将是 -7 :)

于 2013-03-20T13:31:22.457 回答
1

我建议在帐户上使用 JOIN,在其他两个表上使用 LEFT OUTER JOIN。帐户上的 JOIN 意味着它必须在帐户表中。coupon_used 和 used 上的 LEFT OUTER JOINS 意味着无论它们是否在该表中,它都会返回一条记录。过滤到 c.user_id IS NULL 意味着该表中没有记录。

SELECT users.* 
FROM users
    JOIN accounts ON users.id = accounts.user_id
    LEFT OUTER JOIN coupon_used c ON users.id = c.user_id AND c.code = 'XXXXX'
    LEFT OUTER JOIN `used` u ON users.id = u.user_id AND DATE_SUB( DATE_ADD( CURDATE( ) , INTERVAL 7 DAY ) , INTERVAL 14 DAY ) <= u.created
WHERE id IN ( 2024 ) 
AND c.user_id IS NULL
AND u.user_id IS NULL
于 2013-03-20T13:31:42.007 回答