2011-09-26 6 views
0

좋아요. 그래서 date_created, last_login, last_updated 등과 같은 것들을위한 datetime 컬럼이 여러 개 있습니다. 가장 최근의 datetime을 보여주는 하나의 컬럼으로 병합하고 싶습니다. active_users를보다 쉽게 ​​추적 할 수 있습니다.MySQL은 여러 개의 날짜 열을 하나로 병합합니다.

나는 CONCAT 명령을 사용하기위한 몇 가지 제안을 찾았지만 모든 결과를 함께 묶는 것처럼 보입니다.

답변

2

이 시도 :

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 

는 다시 편집 : 당신의 DB 사본 (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 

exaclty 획득 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 개를 읽을 수 있습니다).

+0

이것은 처음에는 작동하는 것으로 보였지만, 행의 1/10 정도만 값을 찾았습니다. 내가 '가장 컸다'를 '가장'로 바꿨을 때 행의 1/5이 같았습니다. 문제 진단을 위해 노력하고 있지만 운이별로 없습니다. –

+0

몇 개의 열을 삭제하면 데이터가있는 행의 수가 증가합니다. 어쩌면 어떤 형태의 OR 연산자를 포함 할 수 있습니까? –

+0

@ Ryan Grush :이 동작에 대해 들어 본 적이 없습니다. ( – Marco

0

값이 null 일 수 있고 처음이 아닌 null 값을 선택하려면 COALESCE를 사용하십시오. GREATESTLEAST는 옵션입니다

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를 사용할 수 있습니다

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 
+0

여기 내가 http://imageshack.us/f/851/screenshot20110926at424.png/와 함께 일하고의 스크린 샷입니다. COALESCE 연산자는 약간 개선되었지만 not_null 열에는 데이터가 있습니다 모든 행에 최신 날짜가 아닌 날짜가 있습니다. –

+0

@ Ryan Grush : IFNULL을 사용하면이 문제를 해결해야합니다 ... – Marco

관련 문제