Mysql Order by Tweak - PullRequest
       8

Mysql Order by Tweak

1 голос
/ 30 июня 2011

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

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

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

Ответы [ 5 ]

2 голосов
/ 30 июня 2011
SELECT s.* FROM (
    SELECT id, comment, time FROM table1
    ORDER BY time DESC
    LIMIT 5 ) as s
ORDER BY s.time ASC
1 голос
/ 30 июня 2011

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

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

1 голос
/ 30 июня 2011

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

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

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

$records = array_reverse($data);

ИЛИ

Это можно сделать с помощью 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";
} 
0 голосов
/ 30 июня 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 .

0 голосов
/ 30 июня 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. Большинство из упомянутых в любом случае потребляют много памяти.

...