MySQL объединяет несколько столбцов даты в один - PullRequest
0 голосов
/ 27 сентября 2011

Хорошо, поэтому у меня есть несколько столбцов datetime для таких вещей, как date_created, last_login, last_updated и т. Д. Я хотел бы объединить их в один столбец с самым последним отображением datetime, чтобы я мог легче отслеживать active_users.

Я нашел несколько предложений по использованию команды CONCAT, но похоже, что все результаты объединяются.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Попробуйте это:

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

и убедитесь, что возвращаемое число совпадает сquery

SELECT COUNT(*) FROM users

Ваша проблема может быть получена из ограничения на общее количество возвращенных или показанных записей.
Например, с помощью Navicat light вы можете иметь 1000 записей (но вы можете прочитать 27,451 как общее).

0 голосов
/ 27 сентября 2011

Если значения могут быть нулевыми, и вы хотите выбрать первое не 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...