채택완료

mysql 정렬 질문입니다.

id createdDatetime updatedDatetime
1 2021-01-21 18:02:11 NULL
2 2021-02-08 14:44:39 2021-02-08 14:46:25
3 2021-01-21 17:44:43 2021-01-22 16:04:21
4 2021-01-21 17:44:43 NULL

1,4번은 생성 이후 수정하지 않아서 updatedDatetime이 null인 상태입니다. 

정렬순서를 2-3-1-4 이런 순으로 하고 싶습니다. 

updatedDatetime, createdDatetime 두 항목을 하나의 항목처럼 만들어서 정렬을 시키고 싶은데 어떻게 해야 가능할까요 ㅠ

Copy
ORDER BY (CASE createdDatetime WHEN NULL THEN updatedDatetime
  else updatedDatetime) desc

이런식으로 접근했지만 문법이 틀렸어요 ㅠ

|

답변 4개 / 댓글 3개

채택된 답변
+20 포인트
Copy
CREATE TABLE IF NOT EXISTS `zoo1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `createdDatetime` datetime DEFAULT NULL,
  `updatedDatetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


INSERT INTO `zoo1` VALUES(1, '2021-01-21 18:02:11', NULL);
INSERT INTO `zoo1` VALUES(2, '2021-02-08 14:44:39', '2021-02-08 14:46:25');
INSERT INTO `zoo1` VALUES(3, '2021-01-21 17:44:43', '2021-01-22 16:04:21');
INSERT INTO `zoo1` VALUES(4, '2021-01-21 17:44:43', NULL);

INSERT INTO `zoo1` VALUES(5, '2021-02-08 14:46:26', NULL);
Copy
SELECT * FROM `zoo1` WHERE 1 
ORDER BY 
CASE  
    WHEN `updatedDatetime` IS NULL THEN 1
    ELSE 0
    END,

`updatedDatetime` DESC,
`createdDatetime` DESC

// 2-3-5-1-4

답변에 대한 댓글 1개

아 이런 정렬방식 사용하고있으면서 생각으로 못하고 있었네요 ㄷㄷ
[code]
SELECT * FROM `zoo1` WHERE 1
ORDER BY
CASE
WHEN `updatedDatetime` IS NULL THEN `createdDatetime`
ELSE `updatedDatetime`
END DESC
[/code]
좀 수정해서 저는 이렇게 사용합니다.
2021-02-10 (수) 14:00:01

ORDER BY IFNULL(`updatedDatetime`, `createdDatetime`) DESC

이렇게 하시면 되지 않을까요?

이게 맞는 방법인지는 모르겠지만

생성 시 createdDatetime, updatedDatetime 둘 다 데이터를 넣는 방향으로 해결했습니다.

2021-02-10 (수) 10:43:35

order by updateDatetime desc, createdDatetime desc

order by를 이렇게 같이 해보세요

답변에 대한 댓글 2개

우선 답변 감사합니다.
이렇게 하면 updatedDatetime null인 데이터가 가장 아래로 내려가 최근에 등록했지만 수정한 기록이 없다면 가장 아래로 내려갑니다.
만약 5번 데이터로 createDatetime = 2021-02-10 10:00:00 updateDatetime = null 로 생성되었다면
원하는 순서는 5-2-3-1-4 순인데
위와 같이 정렬한다면 2-3-5-1-4 로 나와요

답변을 작성하려면 로그인이 필요합니다.