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)

ユーザー テーブルに ID 2024 がありますが、この ID 2024 は使用済みテーブルにあります。したがって、このクエリを実行すると、2024 id も表示されますが、これは除外する必要があります。特定のユーザーを選択したクエリを実行してから、これらのユーザーをフィルターで除外して、使用されているテーブルに含めないようにします。しかし、上記のクエリでは、望ましい結果が得られません。欲望の結果は、次の条件でユーザーを選択したいということです。特定のユーザーを取得し、それらが使用済みテーブルにもクーポン_使用済みテーブルにもないことを確認しますが、アカウント テーブルにある必要があります。

4

3 に答える 3

1

Firstly, try something like this using joins. Which should be easier to read and (depending on the version of MySQL) faster

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

EDIT - Simplifying the date check:-

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 を使用し、他の 2 つのテーブルに 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 に答える