Заказ Mysql с помощью настройки

У меня есть база данных с почти 100 полями. Структура БД

id | комментарий | время

Мне нужно получить только 5 самых новых записей (я могу получить эти записи с помощью ORDER по времени DESC). Но при их печати мне нужно сначала распечатать самую старую из этих 5 записей и действовать в обратном порядке, так что самая новая запись будет напечатана последней.


person vasanth.v    schedule 30.06.2011    source источник


Ответы (4)


Хорошо, после получения набора результатов в порядке возрастания с ограничением количества строк

вы можете сделать это, чтобы распечатать их в обратном порядке (по убыванию)

$data= array();
while ($row = mysql_fetch_assoc($result)) {
    $data[] = $row;
}

$records = array_reverse($data);

OR

Это можно сделать с помощью mysql_data_seek.

Непосредственно взято с здесь

for ($i = mysql_num_rows($resultset) – 1; $i >= 0; $i–) {
    mysql_data_seek($resultset, $i);
    $row = mysql_fetch_assoc($result);
    echo $row['abc'] . ' ' . $row['xyz'] . "\n";
} 
person Shakti Singh    schedule 30.06.2011

Вы можете использовать функцию PHP array_reverse() в своем списке результатов.

http://php.net/manual/en/function.array-reverse.php

person Sinan    schedule 30.06.2011

Вы также можете использовать что-то вроде этого:

select * from (select * from table_name where 1=1 order by time desc 
limit 5) as tbl order by tbl.time;

Отредактируйте, если у вас много обращений к этому оператору, было бы гораздо лучше представить его как материализованное представление. Хотя в mysql нет материализованных представлений, их можно смоделировать (http://lists.mysql.com/mysql/207808)

Использование материализованного представления или смоделированного материализованного представления значительно превосходит предлагаемые подходы php. Большинство из упомянутых в любом случае потребляют слишком много памяти.

person fyr    schedule 30.06.2011

Я думаю, вы могли бы сделать что-то вроде (непроверено):

SELECT
    *
FROM (
    SELECT
        id, comment, time
    FROM
        table
    ORDER BY
        time DESC
    LIMIT 5
)
ORDER BY
    time ASC

ОБНОВЛЕНИЕ
Очевидно, «производная таблица должна иметь собственный псевдоним» (ошибка № 1248). Другие ответы уже сделали это, поэтому я присоединюсь к победителю. Ниже вы найдете исправленный (и проверенный) запрос:

SELECT
    derived.*
FROM (
    SELECT
        id, comment, time
    FROM
        table
    ORDER BY
        time DESC
    LIMIT 5
) AS derived
ORDER BY
    derived.time ASC

Кстати, это поддерживается начиная с MySQL 4.1 < / а>.

person jensgram    schedule 30.06.2011