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

Печать / RSS
29

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
@Andrei4ik93, я их итак все могу вытащить. мне интересно этот скрипт норм?
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
Прикрепленные файлы:
Для выполнения действия необходимо авторизоваться!
Стикеры / Теги / Правила / Топ тем / Топ тем / Поиск