Требуется помощь специалистов

Печать RSS
654

H
Автор
Пришелец
0
Вот набросал скрипт личных сообщений с диалогами. Как вам такой вариант? Пока функционал только вывести список диалогов и сообщений

<?php

require 'db.php';
$start = microtime(true);


$my_login = $_SESSION['my_login'];
$nomy_login = $_GET['u'];





$row = mysqli_query($db, "SELECT dialog1, dialog2 FROM messages2 WHERE (otkogo = '$my_login' OR komu = '$my_login') AND (dialog1 != '$my_login' OR dialog2 != '$my_login') AND (dialog1 != '') AND (dialog2 != '') ORDER BY tdialog DESC;");


while($r=mysqli_fetch_array($row))
{
if ($r['dialog1'] == $my_login){echo '<a href="dialogs2.php?u='.$r['dialog2'].'">'.$r['dialog2'].'</a><br>';}else{echo '<a href="dialogs2.php?u='.$r['dialog1'].'">'.$r['dialog1'].'</a><br>';}

}



$row = mysqli_query($db, "SELECT * FROM messages2 WHERE (otkogo = '$my_login' AND komu = '$nomy_login') OR (otkogo = '$nomy_login' AND komu = '$my_login') ORDER BY id DESC;");


while($r=mysqli_fetch_array($row))
{

echo $r['otkogo'].$r['message'].'<br>';
}



$end = microtime(true);
$tt = $end-$start;
echo '<br>Время выполнения '.$tt;
?>

сама таблица состоит из колонок:
айди, откого, кому, сообщение, диалог1, диалог2, время последнего обновления диалога.

где диалог1 и диалог2 это участники диалога
H
Автор
Пришелец
0
Может что то исправить можно чтоб быстрее работало?
J

Землянин
0
Не совсем понятно, если есть от кого и кому в проверке запроса, для чего еще проверка диалога?
H
Автор
Пришелец
0
JiGaN, ну если общаются 100 человек на сайте то чтобы узнать к какому диалогу отнести сообщение.
в диалоге максимум 2 человека

Добавлено через 03:36 сек.
при отправке сообщения идет проверка есть ли диалог с таким юзером или нет. Если нет то создается новый один раз на все сообщения. если есть диалог то просто обновление метки времени диалога
Изменил: horoshinkin777 (27.01.2019 / 12:55)
А

Чатланин
0
типа если применить JOIN то вполне возможно вытащить все нужные запросы
H
Автор
Пришелец
0
Андрей, я их итак все могу вытащить. мне интересно этот скрипт норм?
Z

++=>
-1
horoshinkin777, нет, не норм. MySQL - это реляционная СУБД. Тут ничем подобным не пахнет. Ещё и логины текстовые используются в каждой записи, да?

Как минимум, физическую схему базы данных нужно посмотреть.
И схеме приложить те функции, которые должны быть удовлетворены при помощи предлагаемой схемы.
H
Автор
Пришелец
0
ZiGR, ниче не понял из твоих слов))

Господин ПЖ
0
horoshinkin777, я тебе уже говорил, что так не проектируют таблицы, у тебя очень много индексов будет, таблица не оптимальна, не нормализована
если у тебя обычная переписка, то можно обойтись двумя полями user_id, author_id
где user_id это мой id, а author_id - id отправителя
теперь чтобы получить все переписки достаточно сделать составной индекс из 2-х полей
Все переписки where user_id = 1
все диалоги нужны группируй по author_id

Если у тебя диалоги со множеством пользователей, нужно делать еще отдельную таблицу, типа dialogs

а в messages добавить поле dialog_id
и группировать по диалогам,
в плане нормализации https://habr.com/ru/post/254773 , вариант который я предложил с двумя участниками не прям уж очень правильный, но вполне оптимальный для работы

а то что ты придумал, прости, но это только на помойку

Добавлено через 07:07 сек.
select
   * 
from
   `messages` 
   inner join
      (
         select
            `author_id`,
            max(created_at) as last_created_at 
         from
            `messages` 
         where
            `user_id` = 1
         group by
            `author_id`
      )
      as `latest_message` 
      on `messages`.`created_at` = `latest_message`.`last_created_at` 
      and messages.author_id = latest_message.author_id 
where
   `user_id` = 1
order by
   `created_at` desc
Это список диалогов

Добавлено через 07:59 сек.
А это просмотр диалога
select * from `messages` where `user_id` = 1 and `author_id` = 2 order by `created_at` desc
Изменил: Вантуз-мен (28.01.2019 / 14:33)

Господин ПЖ
0
Explain
Прикрепленные файлы:
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск