PHP: ЗАПРОС MYSQL Упорядочено по

Таблица изображений введите здесь описание изображения

Привет, у меня есть таблица comments, и мне нужно взять последние три комментария, но по-другому:

8
9
10

Мой код показывает это:

10
9
8

Код:

$sql_query = $connection->query("SELECT * FROM comments WHERE `post_id` = '38' ORDER BY `id` DESC LIMIT 3");

while ($ff = $sql_query->fetch_array(MYSQLI_ASSOC)) {
    echo $ff["text"]. "</br>";
}

Заранее спасибо !


person GA ASD    schedule 26.12.2016    source источник
comment
Оберните свое утверждение в подзапрос и отсортируйте его в порядке возрастания по идентификатору комментария.   -  person Terry    schedule 27.12.2016
comment
Думаю, изменение «DESC» на «ASC» заставит это работать.   -  person Expressingx    schedule 27.12.2016
comment
@ Терри, пожалуйста, покажи мне код   -  person GA ASD    schedule 27.12.2016
comment
@Denisx нет, не работает   -  person GA ASD    schedule 27.12.2016
comment
ORDER BY text ASC если этот ASC не работает с порядком по text, используйте DESC   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- с LIMIT 3, который вернет 1, 2 и 3 или 10, 9, 8 снова. Для этого требуется подзапрос или ручное реверсирование массива результатов.   -  person sidyll    schedule 27.12.2016
comment
@sidyll Я не понимаю, почему ASC у них не работает, как предполагалось ранее.   -  person Funk Forty Niner    schedule 27.12.2016
comment
@GAASD у вас есть ответы ниже, см.   -  person Funk Forty Niner    schedule 27.12.2016
comment
@Fred-ii- order by text вернет (1,2,...,10), а с limit это станет (1,2,3). С desc (10,9,...1) становится (10,9,8). Он хочет (8,9,10). Дело в том, что limit отсчитывается от начала сета. Для подсчета с конца нужен подзапрос.   -  person sidyll    schedule 27.12.2016
comment
@sidyll Спасибо за информацию.   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- Спасибо. Единственная другая альтернатива, о которой я мог подумать, - это использование limit со смещением, например, order by text limit 3 offset 7 будет работать. Это заставило меня задуматься о том, можем ли мы создать этот номер смещения динамически с помощью подзапроса. Я отправлю вопрос экспертам MySQL здесь.   -  person sidyll    schedule 27.12.2016
comment
@sidyll Забавно, что вы должны упомянуть об опции смещения LIMIT. Я написал комментарий к ОП по этому поводу, но удалил его. Я должен был оставить его на месте. Думаю, я мог бы попросить мод восстановить, но чувствую, что это того не стоит.   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- Интересно. В этом конкретном случае я думаю, что самый простой способ - это изменить набор с помощью PHP, но действительно, если количество строк известно, ограничение со смещением - это супер чистый способ сделать это. Однако я не знаю, можно ли считать строки как подзапрос и использовать его как смещение, все в одном запросе. Только что опубликовал вопрос об этом.   -  person sidyll    schedule 27.12.2016
comment
@sidyll вдвойне интересный комментарий. Я буду следить за вашим вопросом, ура   -  person Funk Forty Niner    schedule 27.12.2016
comment
@GAASD, не могли бы вы рассказать мне, почему вы пошли и удалили свой вопрос, с которым мы вам помогали? stackoverflow.com/q/41371073/1415724 У меня есть хороший способ сообщить модератору, чтобы он был восстановлен. Понятно, что мы решили это за вас. Это было неправильно.   -  person Funk Forty Niner    schedule 29.12.2016


Ответы (2)


Вы можете сделать это с помощью подзапроса, как описано в этом вопросе. Однако может быть проще просто использовать PHP array_reverse():

$rows = array_reverse($sql_query->fetch_all(MYSQLI_ASSOC));
foreach ($rows as $ff)
    echo $ff["text"]. "</br>";

С подзапросом, если хотите:

SELECT * FROM (
  SELECT * FROM comments
  WHERE `post_id` = '38'
  ORDER BY `id` DESC LIMIT 3
) t ORDER BY t.id

По сути, это создает производную таблицу с псевдонимом t с результатом вашего исходного запроса и переупорядочивает этот ограниченный набор результатов.

person sidyll    schedule 26.12.2016
comment
Я должен помнить об этом array_reverse(). Я никогда не использовал его раньше, но, возможно, в будущем. - person Funk Forty Niner; 27.12.2016

Следующий запрос даст вам желаемый результат

select * from (SELECT * FROM comments WHERE `post_id` = '38' ORDER BY `id` DESC LIMIT 3) temp order by id
person reza    schedule 26.12.2016