Вывести с одной таблицы с разной сортировкой - MySQL

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, передо мной возникла следующая задача, нужно вывести сами сообщения и комментарии к этим сообщениям, должен получится вывод в виде древа с одним условием, сообщения выводятся новые вверху, а комментарии к ним новые внизу. Я все это сделал, но из за того что разная сортировка у меня два запроса, одним получаю сообщения под одной сортировкой, комментарии к ним под другой а потом их совмещаю в один массив:
$parent = DB::me()->query("SELECT * FROM `wall_posts` WHERE `id_user` = '$id_ank' AND `parent` = '0' ORDER BY `id` DESC")->fetchAll() ;
        $children = DB::me()->query("SELECT * FROM `wall_posts` WHERE `id_user` = '$id_ank' AND `parent` > '0' ORDER BY `id` ASC")->fetchAll() ;
        $result = array_merge($parent, $children);
Можно это дело оптимизировать?

Решение задачи: «Вывести с одной таблицы с разной сортировкой»

textual
Листинг программы
SELECT m.*, c.Id as cId, c.Parent as cParent, ... 
FROM 
  wall_posts m
  LEFT JOIN wall_posts c ON m.Id = c.parent 
WHERE m.d_user = $id_ank AND m.parent = 0 
ORDER BY m.id DESC, c.Id ASC

Объяснение кода листинга программы

В данном коде происходит следующая последовательность действий:

  1. Выполняется запрос SQL с помощью оператора SELECT, выбираются необходимые поля из таблицы wall_posts (включая поля из таблицы c, которые присоединены с помощью оператора LEFT JOIN).
  2. Устанавливается условие для выборки: в WHERE-клозе указывается, что нужно выбрать только те записи, которые принадлежат пользователю с идентификатором $id_ank и не имеют родителя (parent = 0).
  3. Устанавливается порядок сортировки: в ORDER BY указывается, что нужно сначала сортировать записи по убыванию идентификатора записи (m.id DESC), а затем по возрастанию идентификатора родительской записи (c.Id ASC). Список переменных и их значений:
  4. m.* - переменная, которая ссылается на все поля таблицы wall_posts
  5. c.Id as cId, c.Parent as cParent - здесь происходит выборка полей из таблицы c (используется псевдоним cId для поля c.Id и cParent для поля c.Parent)
  6. $id_ank - значение переменной, которое используется в условии WHERE
  7. 0 - значение переменной, которое также используется в условии WHERE Получается, что данный код выбирает записи из таблицы wall_posts, которые принадлежат определенному пользователю и не имеют родительской записи, а затем сортирует их по убыванию идентификатора записи и возрастанию идентификатора родительской записи.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы