Вывод и последующая сортировка записей

249
26 ноября 2016, 20:14

Есть 4 таблицы:
fandom - Название группы диалогов.
dialog - Список диалогов в группе.
dialog_users - Пользователи в каждом диалоге группы.
chat - Сообщения в определенном диалоге.

Задача:
Вывести на страницу профиля диалоги в порядке (Новые выше) + выше новых диалогов выводить те диалоги, в которых добавлены новые сообщения (Пример как ВК, Facebook).
Готовые наработки: Есть вывод диалогов. Нет сортировки по сообщениям.

Код наработок:

$sql_dialog = mysql_query("
SELECT `d`.*,
(SELECT `f_title` FROM `fandom` WHERE `id` = `d`.fandom) AS `f_title` 
FROM `dialog_users` d 
WHERE `d`.users = '$_SESSION[id]' 
GROUP BY `d`.fandom ORDER BY `date` DESC");
    while($dialog = mysql_fetch_assoc($sql_dialog)){
        $array_dialog[] = $dialog['dialog'];
    }
//Вывод сообщений по диалогам
$sql_chat = mysql_query("
SELECT `dialog`,`text`,`status` 
FROM `chat` 
WHERE `dialog` IN (".implode(',',$array_dialog).") 
GROUP BY `dialog` ORDER BY `date` DESC");
    while($chat = mysql_fetch_assoc($sql_chat)){
        $array_chat[] = $chat['dialog'];
    }
    foreach(){
    //Соединение обеих массивов
    }


Идеально было бы сделать все это в одном запросе.
По данному коду мне не понятно, как сделать вывод диалогов по новым сообщениям (За это отвечает поле status(1/0) в таблице chat) и добавление условия, если status = 0 то сортировать только по date.
Если есть мысли как возможно доделать этот код, был бы безмерно благодарен Вашей помощи...

Answer 1
SELECT `d`.*,
       (SELECT `f_title` FROM `fandom` WHERE `id` = `d`.fandom) AS `f_title`,
       exists(select 1 from `chat` c where c.dialog=d.dialog and status=1) AS `newMsg`
  FROM `dialog_users` d 
 WHERE `d`.users = '$_SESSION[id]' 
 GROUP BY `d`.fandom
 ORDER BY newMsg DESC, `date` DESC

Вместо exists (которое проверяет только наличие таких записей) можно выбирать например количество сообщений в chat или дату последнего нового сообщения.

Или например текст последнего сообщения:

SELECT `d`.*,
       (SELECT `f_title` FROM `fandom` WHERE `id` = `d`.fandom) AS `f_title`,
       (select text from `chat` c
         where c.dialog=d.dialog and status=1
         order by c.date desc
         limit 1
       ) AS `lastMsg`
  FROM `dialog_users` d 
 WHERE `d`.users = '$_SESSION[id]' 
 GROUP BY `d`.fandom
 ORDER BY lastMsg DESC, `date` DESC
READ ALSO
PrimaryKey, ForeignKey и их особенности

PrimaryKey, ForeignKey и их особенности

ЗдравствуйтеСтолкнулся с MySQL

241
INSERT INTO … SELECT

INSERT INTO … SELECT

Что делают эти операторы в пределах одного выражения? Впервые наткнулся на подобный синтаксисВроде:

246
Получение ID последнего добавленного елемента

Получение ID последнего добавленного елемента

Как получить id последнего добавленного елемента? Нашел следующую конструкцию SELECT LAST_INSERT_ID() НО на сколько она безопасна?

275
Как соединить несколько таблиц sql

Как соединить несколько таблиц sql

Имеется две таблицы: user, proc_leader

277