2012-03-04 5 views
0

私はあるテーブルからユーザの登録日を選択するクエリを持っています。あるテーブルから他のテーブルにないユーザを選択する

SELECT DATE(registered) 
FROM users 
WHERE user_id= ".$currentUser." 
ORDER BY registered ASC 
LIMIT 1 

Iは、ユーザが会員IDが一定値以下であり、アクセス日時は、第2のテーブル(「アクセス」)には存在しないことを確認するために別のテーブルを結合して元のクエリを変更する必要が特定の日付より下に。

LEFT JOIN access ON (users.user_id = access.user_id) 
WHERE access.user_id < 500 
AND access.date ... after March 1, 2012 

これらの2つを一緒に取得する方法がわかりません。

答えて

2

あなたは相関サブクエリ、例えば使用することができますいくつかの

SELECT DATE(u.registered) 
    FROM users u 
    WHERE u.user_id = ".$currentUser." 

    AND NOT EXISTS (
      SELECT 1 
       FROM access a 
       WHERE u.user_id = a.user_id 
       AND a.user_id < 500 
       AND a.date > DATE '2012-03-01') 

ORDER BY registered ASC 
LIMIT 1; 

を注:
accessテーブルに一致する行がなくても、まだ行が戻ってきます。
あなたはおそらくこれを知っています... ASCはデフォルトのソート順ですので、入力する必要はありません。

+0

素晴らしい!私はちょうど何かを考えました。私は日付が必要です。日付>日付 '2012-03-01'しかし、それは今日の日付にすることはできません...私はちょうど追加することはできますa.date!= NOW()? – santa

+1

ええ、サブクエリにもう1行追加してください: 'AND a.date <> CURDATE()' – bernie

2

あなたがそうでなければ、効果的に参加し、内側にそれを向けるだろう、参加するには、条件全体を配置する必要があります。

... 
LEFT JOIN access ON (
    users.user_id = access.user_id 
    AND access.user_id < 500 
    AND access.date >= '20120301' 
) 
WHERE access.user_id is null 
... 
+0

"他のテーブルにない場合は1つのテーブルから" =アンチ・ジョイン。 – onedaywhen

+0

@onedaywhen:はい、それは左結合を使用してヌル値をチェックするときに行うことです。 – Guffa

+0

@onedaywhen:あなたが運が良ければ、クエリプランナーは、より効率的であるため、 'not exists()'を左結合にします。 – Guffa

関連する問題