2011-02-28 2 views
0

두 개의 열 뒤에 MySQL 테이블을 정렬해야하지만 일반 정렬과는 다릅니다. 채팅 응용 프로그램에서 내가 결과를 타임 스탬프 필드으로 분류뿐만 아니라SELECT ... ORDER BY 필드 (SELECT ...) 중복 필드에서 작동하지 않습니다.

CREATE TABLE messages (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    sender int(10) unsigned NOT NULL, 
    message char(255) NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; 

INSERT INTO messages VALUES ('1', '2011-02-28 01:58:24', '3', '1'); 
INSERT INTO messages VALUES ('2', '2011-02-28 01:58:28', '3', '2'); 
INSERT INTO messages VALUES ('3', '2011-02-28 01:58:35', '1', '5'); 
INSERT INTO messages VALUES ('4', '2011-02-28 01:58:36', '2', '7'); 
INSERT INTO messages VALUES ('5', '2011-02-28 01:58:38', '3', '3'); 
INSERT INTO messages VALUES ('6', '2011-02-28 01:58:39', '2', '8'); 
INSERT INTO messages VALUES ('7', '2011-02-28 01:58:40', '1', '6'); 
INSERT INTO messages VALUES ('8', '2011-02-28 01:58:41', '3', '4'); 

그래서 자신의 보낸 사람별로 그룹화 얻을하려면 : 타임 스탬프 BY

ORDER, 보낸 사람는 보낸 사람이

ORDER 쓸모가 , 타임 스탬프은 꽤 괜찮은 편이지만 처음에는 이전 메시지가 표시되지 않습니다.

SELECT timestamp, sender, message FROM messages ORDER BY sender IN (SELECT DISTINCT sender FROM messages ORDER BY timestamp), timestamp; 

그것이 작동해야합니다 가정으로 작동하지 않습니다.

+---------------------+--------+---------+ 
| timestamp   | sender | message | 
+---------------------+--------+---------+ 
| 2011-02-28 01:58:24 |  3 | 1  | 
| 2011-02-28 01:58:28 |  3 | 2  | 
| 2011-02-28 01:58:38 |  3 | 3  | 
| 2011-02-28 01:58:41 |  3 | 4  | 
| 2011-02-28 01:58:35 |  1 | 5  | 
| 2011-02-28 01:58:40 |  1 | 6  | 
| 2011-02-28 01:58:36 |  2 | 7  | 
| 2011-02-28 01:58:39 |  2 | 8  | 
+---------------------+--------+---------+ 

어떤 아이디어 : 그리고 여기에 내가 (: P를 OFC 내가이 쿼리에서 무엇을 얻을 수 없음)이 쿼리에서 예상 무엇인가? 모래밭? 팁? 아무것도? 사전에 덕분에, 질문은

+0

당신이 정확하게 명시 할 수 쿼리를 달성하도록되어 무엇을 :

UPDATE는
당신은 아마 이런 식으로 뭔가를해야합니다. 당신은 불규칙 정렬을하고 당신이 원하는 것을하지 않는 두 가지 예제를 제공하기를 원한다고 말했지만, 실제로 원하는 것을 설명하지 않고 제공된 테이블에서 그것을 추론하려고 시도하는 것은 어렵습니다. – Hamish

+0

마지막 테이블은 내가 얻고 자하는 완벽한 쿼리 결과입니다. D – SYNCRo

+0

보낸 사람별로 그룹화 된 모든 메시지를 얻고 타임 스탬프별로 정렬해야하지만 보낸 사람과 타임 스탬프별로 정렬하지 않아야합니다. – SYNCRo

답변

1

당신을 위해 작동합니까 ORDER BY sender asc, timestamp desc?

SELECT a.timestamp, a.sender, a.message 
FROM messages a 
INNER JOIN 
(SELECT b.sender_id, MIN(b.timestamp) as timestamp 
    FROM messages b GROUP BY sender 
)c ON (c.sender = a.sender) 
ORDER BY c.timestamp, a.sender 
+0

아니요, 발신자 ASC에 의한 정렬이 나에게 첫 번째 메시지 타임 스탬프를주지 않기 때문에, 나에게 첫 번째 보낸 사람을 알려주십시오 – SYNCRo

+0

업데이트 된 버전이 원하는 것입니다 (최소한의 타임 스탬프로 정렬 한 다음 보낸 사람이) – a1ex07

+0

1054 - '필드 목록'의 알 수없는 열 'b.sender_id' – SYNCRo

0
SELECT * FROM messages ORDER BY sender, timestamp ASC; 

당신에게 타임 스탬프으로 분류되어 각 보낸 데이터를 제공 한 후 타임 스탬프로, 보낸 사람에 의해 정렬합니다 환영합니다. MySQL에서는 여러 정렬을 사용할 때 하나씩 정렬 한 다음 다른 정렬을 정렬합니다.

당신이 달성하려고 시도하는 것은 .. 글쎄, 불가능합니다. 보낸 사람 아이디어가 순서에 맞지 않으면 보낸 사람을 그룹화 할 수 없습니다. 내가 준 것은 MySQL에서 가장 가까운 것입니다.

+0

오케이, what about about 'SELECT * FROM countries ORDER iso_code IN ('UK', 'US') desc, iso_code', 하나의 필드를 기반으로 한 두 가지 종류가 있습니다. (MySQL SELECT 구문 페이지에서 복사 한 쿼리 (http://dev.mysql.com/doc/refman/5.0/en/select.html) – SYNCRo

관련 문제