SELECT ... ORDER BY field IN (SELECT ...) не работает с повторяющимся полем - PullRequest
0 голосов
/ 28 февраля 2011

Мне нужно отсортировать таблицу MySQL после двух столбцов, но не как обычную сортировку.В приложении чата я хочу получать результаты, отсортированные по полю отметки времени, но также сгруппированные по их отправителю

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');

Итак:

ORDER BY timestamp, отправитель бесполезен

ORDER BY отправителя, отметка времени довольно хорошо, но сначала она не будет отображать старые сообщения

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

не работает, так как я предполагаю, что она должна работать.И вот что я ожидал от этого запроса (ofc не то, что я получаю из этого запроса: P):

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

Есть идеи?ссылки?чаевые?что-нибудь?Заранее спасибо, любые вопросы приветствуются

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Будет ли у вас работать ORDER BY sender asc, timestamp desc?

UPDATE
Возможно, вам нужно что-то вроде этого:

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 голосов
/ 28 февраля 2011
SELECT * FROM messages ORDER BY sender, timestamp ASC;

Сортирует по отправителю, затем по отметке времени, предоставляя вам данные каждого отправителя, отсортированные по отметке времени. В MySQL, когда вы используете несколько сортировок, он сортирует только одну, а затем другую.

То, что вы пытаетесь достичь, это ... ну, невозможно, вы не можете сгруппировать отправителей, если они не соответствуют идеям отправителей ... что я дал, так это то, что вы ближе всего получите в MySQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...