1

UNIX 形式の最終アクセス日を含むテーブルがあります。最終アクセス日が 180 日を超えているテーブル内のすべてのレコードを照会したいと考えています。

これは私の現在のクエリです

SELECT  id, auth, username, IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual'

次のように、NotAccessedIn6Months の結果を使用して結果セットをフィルタリングできるようにする必要があります。

SELECT  id, auth, username, IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual' AND NotAccessedIn6Months = 'Y'

しかし、後者の形式は違法です。

ありがとうございました。

4

5 に答える 5

2

次のように、WHERE の代わりに HAVING を使用します。

SELECT id, auth, username, 
       IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N') As NotAccessedIn6Months
  FROM mdl_user 
 WHERE auth = 'manual' 
HAVING NotAccessedIn6Months = 'Y'

... または、この条件を WHERE に移動します (この特定のクエリでは「N」値がまったく表示されないため)。

SELECT id, auth, username 
  FROM mdl_user 
 WHERE auth = 'manual' 
   AND DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess)) >= 180
于 2012-07-03T17:02:38.920 に答える
2

WHERE句でそれを組み合わせることができませんか:

SELECT  id, auth, username
FROM  mdl_user 
WHERE auth = 'manual' AND DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180
于 2012-07-03T17:03:50.067 に答える
1

計算値エイリアスは WHERE では使用できませんが、HAVING 句では使用できます。ただし、HAVING はクエリ時にフィルター処理を行うのではなく、完全な結果セットに対してフィルター処理を行うため、これはパフォーマンスに影響を与えます。

于 2012-07-03T17:03:12.633 に答える
1

HAVING は、SELECT ステートメントで使用されるグループまたは集計関数の検索条件を指定します。

SELECT  id,
        auth,
        username,
        IF(DATEDIFF(NOW(), FROM_UNIXTIME(lastaccess))>=180,'Y','N')
            As NotAccessedIn6Months
FROM  mdl_user 
WHERE auth = 'manual'
HAVING NotAccessedIn6Months = 'Y'
于 2012-07-03T17:01:54.373 に答える
0
SELECT  id, auth, username
FROM  mdl_user 
WHERE auth = 'manual' AND lastaccess < UNIX_TIMESTAMP(CURRENT_DATE - interval 180 DAY)

CURRENT_TIMESTAMP代わりに使用することもできますCURRENT_DATE

于 2012-07-03T17:27:55.143 に答える