Как выбрать последние строки в MySQL? - PullRequest
5 голосов
/ 15 сентября 2011

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

  • id (автоматическое увеличение)
  • до
  • с
  • отметка времени
  • текст

Данные выглядят примерно так:

|id | to     | from   | time stamp | text
| 1 | user01 | user02 | 2011-09-01 | text1
| 2 | user01 | user02 | 2011-09-02 | text2
| 3 | user02 | user01 | 2011-09-02 | text3
| 4 | user01 | user03 | 2011-09-03 | text4
| 5 | user01 | user04 | 2011-09-03 | text5
| 6 | user01 | user03 | 2011-09-04 | text6
| 7 | user03 | user01 | 2011-09-05 | text7

Я хочу select * WHERE to = 'user01' и последние данные (возможно, по "id" или "отметке времени").«От» может быть много, но каждый «один из» данных может появляться только один раз.


В любом случае, выбранные данные будут:

| 2 | user01 | user02 | 2011-09-02 | text2
| 5 | user01 | user04 | 2011-09-03 | text5
| 6 | user01 | user03 | 2011-09-04 | text6

Можно ли это сделать?Спасибо, что нашли время, читая мой вопрос:)

Ответы [ 7 ]

4 голосов
/ 15 сентября 2011
SELECT t.* 
FROM
      TableX AS t
  JOIN
      ( SELECT DISTINCT `from` AS f
        FROM TableX
        WHERE `to` = 'user01'
      ) AS df
    ON 
      t.id = ( SELECT tt.id
               FROM TableX AS tt
               WHERE tt.`to` = 'user01'
                 AND tt.`from` = df.f
               ORDER BY tt.`timestamp` DESC
               LIMIT 1
             )

Лучше избегать именования таблиц и полей с такими ключевыми словами, как to, from и timestamp.

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

Я думаю, что вы ищете SELECT DISTINCT user_from FROM table WHERE user_to='user1' ORDER BY id DESC?

DISTINCT будет возвращать только одну строку для каждого значения user_from.

2 голосов
/ 15 сентября 2011
SELECT * FROM tablename WHERE to = 'user01' ORDER BY timestamp DESC LIMIT 1

... даст вам самую новую запись.

1 голос
/ 15 сентября 2011

Вы можете сделать это так:

SELECT to, from, max(timestamp) FROM <table> WHERE to = 'user01' GROUP BY from

Чтобы получить связанный текст, вы также можете сделать это так, но это не очень эффективно

SELECT * FROM <table> 
WHERE 
    CONCAT([to], [from], [timestamp]) 
    IN 
    (
     SELECT CONCAT([to], [from], MAX([timestamp])) FROM <table> 
     WHERE [to] = 'user01' GROUP BY [from]
    )
1 голос
/ 15 сентября 2011

Если вы хотите, чтобы последняя строка для каждого уникального from пользователя:

SELECT `from`, MAX(`id`), `to` FROM `tablename` WHERE `to`='user01' GROUP BY `from`

(я думаю, получение МАКСА идентификатора может быть быстрее, чем МАКС. Отметки времени)

1 голос
/ 15 сентября 2011

Одна возможность будет выглядеть примерно так:

SELECT * FROM tbl WHERE id IN (
    SELECT MAX(id) FROM tbl
    WHERE to = 'user01'
    GROUP BY from
);

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

0 голосов
/ 15 сентября 2011
SELECT * FROM `table_name` WHERE `to` = 'user01' ORDER BY `timestamp` DESC LIMIT 0,1
...