わかりましたので、date_created、last_login、last_updated などの複数の datetime 列があります。active_users をより簡単に追跡できるように、それらを 1 つの列にマージして、最新の datetime を表示したいと思います。
CONCAT コマンドを使用するためのいくつかの提案を見つけましたが、それはすべての結果をつなぎ合わせているだけのようです。
これを試して:
SELECT username,
GREATEST(date_created, last_login, last_updated) last_activity
FROM your_table
ORDER BY last_activity DESC
編集:
SELECT username,
GREATEST(
IFNULL(date_created, 0),
IFNULL(last_login, 0),
IFNULL(last_updated, 0)
last_activity
FROM your_table
ORDER BY last_activity DESC
もう一度編集:
あなたのデータベースコピー(27.451レコードを持つ)で私が使用した:
SELECT id,
GREATEST(
IFNULL(current_login_datetime, 0),
IFNULL(created_datetime, 0),
IFNULL(updated_datetime, 0))
last_activity
FROM users
ORDER BY last_activity DESC
正確な 27.451 レコードを取得!!
証明するには、次のクエリを実行します。
SELECT COUNT(*) FROM
(SELECT id,
GREATEST(
IFNULL(current_login_datetime, 0),
IFNULL(created_datetime, 0),
IFNULL(updated_datetime, 0))
last_activity
FROM users
ORDER BY last_activity DESC) der
返された数がクエリと同じであることを確認します
SELECT COUNT(*) FROM users
問題は、返されたレコードまたは表示されたレコードの合計数の制限から派生している可能性があります。
たとえば、Navicat light を使用すると、1000 レコードを持つことができます (ただし、合計で 27.451 を読み取ることができます)。
値が null になる可能性があり、最初の非値を選択したい場合は、null
COALESCE を使用します。GREATEST
オプションでLEAST
もあります
SELECT
username
,COALESCE(last_updated,last_login,date_created) AS not_null
,GREATEST(date_created, last_login, last_updated) AS latest
,LEAST(date_created, last_login, last_updated) AS first
FROM table1
ORDER BY last_activity DESC
さらに制御したい場合は、CASE WHEN ステートメントを使用できます。
SELECT
username
, CASE WHEN date_created > '2011-01-31' THEN date_created
WHEN last_login > '2011-01-31' THEN last_login
ELSE last_updated END as its_complicated
.....
最新の値が必要null
で、値が変動している場合は、次のクエリを使用します。
SELECT
username
,GREATEST(IFNULL(date_created,0), IFNULL(last_login,0), IFNULL(last_updated,0)) AS latest
FROM table1
ORDER BY last_activity DESC