Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите со сложной выборкой.
 
 автор: Ramilka   (08.10.2009 в 03:04)   письмо автору
 
 

Структура таблицы:

CREATE TABLE wall` (
`id` int(10) unsigned NOT NULL auto_increment,
`sender_id` int(10) unsigned NOT NULL,
`receiver_id` int(10) unsigned NOT NULL,
`message` text character set utf8 NOT NULL,
`prev_message` int(10) unsigned default NULL,
)

Таблица сообщений. `message` - текст сообщения, `prev_message` - ID сообщения, которое цитируется (или отвечается на него).
Задача: Нужно сделать выборку сообщений таким образом, чтобы шли сообщения по убыванию своего ID и если на это сообщения есть ответы, то выбрать и их.
Так реализовано на хабре.
Пример:
-Сообщение №10.
-Сообщение №9.
-Сообщение №8.
- - Ответ1 на сообщение №8
- - Ответ2 на сообщение №8
- - - Ответ на ответ
-Сообщение 1
Т.е. структура в виде дерева.

Заранее благодарен.

  Ответить  
 
 автор: cheops   (08.10.2009 в 03:20)   письмо автору
 
   для: Ramilka   (08.10.2009 в 03:04)
 

Возможно вас заинтересуют темы по ссылкам
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=21904
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=63005

  Ответить  
 
 автор: Ramilka   (08.10.2009 в 06:25)   письмо автору
 
   для: cheops   (08.10.2009 в 03:20)
 

Спасибо за помощь!

  Ответить  
 
 автор: Ramilka   (13.10.2009 в 16:10)   письмо автору
 
   для: cheops   (08.10.2009 в 03:20)
 

На данный момент функция сортировки такая:
private function baseSort($id, $parentText = "")
    {
        static $messages = array();
        
        $userID = $this->getId();
        $sql_query = "SELECT w.id as id, w.sender_id as auth_id, w.message as text, w.date as date, w.rate as rate, 
                u.name as auth_fname, u.lastname as auth_lname, u.avatar as avatar
                FROM wall w, users u
                WHERE u.id=w.sender_id AND w.receiver_id=:receiver AND w.is_deleted=FALSE AND prev_message=:message_id 
                ORDER BY date DESC";
        $sql = $this->db->prepare($sql_query);
        $sql->bindParam(':receiver', $userID, PDO::PARAM_INT);
        $sql->bindParam(':message_id', $id, PDO::PARAM_INT);
        $sql->execute();
        while ($row = $sql->fetch(PDO::FETCH_ASSOC))
        {
            if ($parentText != "")
                $row['parent_text'] = $parentText;
                
            $messages[] = $row;
            $this->baseSort($row['id'], $row['text']);
        }
        
        return $messages;
    }


данные сортируются по полю "дата" по убыванию. Как сделать, чтобы сначала выводилась ветка сообщений, у которой самое новое сообщение, потом следующая и тд.

Пример:
Было:
-Сообщение №10.
-Сообщение №9.
-Сообщение №8.
- - Ответ1 на сообщение №8
- - Ответ2 на сообщение №8
- - - Ответ на ответ
-Сообщение 1

Стало:
-Сообщение 1
- - Ответ на сооб. №1. А это самое новое сообщение.
-Сообщение №10.
-Сообщение №9.
-Сообщение №8.
- - Ответ1 на сообщение №8
- - Ответ2 на сообщение №8
- - - Ответ на ответ

  Ответить  
 
 автор: Trianon   (13.10.2009 в 16:26)   письмо автору
 
   для: Ramilka   (13.10.2009 в 16:10)
 

Это, мягко говоря, ни разу не функция сортировки.
Это функция рекурсивного отбора элементов дерева.
Возвращает она plain list (одномерный массив)
В таком виде доточить её до полного порядка довольно трудно.
Лучше пытаться построить дерево на уровне php.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования