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

Печать / RSS
0
1. horoshinkin777 (27.01.19 / 10:22)
Пришелец
Вот набросал скрипт личных сообщений с диалогами. Как вам такой вариант? Пока функционал только вывести список диалогов и сообщений


<?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 это участники диалога
0
2. horoshinkin777 (27.01.19 / 11:00)
Пришелец
Может что то исправить можно чтоб быстрее работало?
0
3. JiGaN (27.01.19 / 12:48)
Землянин
Не совсем понятно, если есть от кого и кому в проверке запроса, для чего еще проверка диалога?
0
4. horoshinkin777 (27.01.19 / 12:54)
Пришелец
@JiGaN, ну если общаются 100 человек на сайте то чтобы узнать к какому диалогу отнести сообщение.
в диалоге максимум 2 человека

Добавлено через 03:36 сек.
при отправке сообщения идет проверка есть ли диалог с таким юзером или нет. Если нет то создается новый один раз на все сообщения. если есть диалог то просто обновление метки времени диалога
Изменил: horoshinkin777 (27.01.19 / 12:55)
0
5. Андрей (27.01.19 / 14:08)
Землянин
типа если применить JOIN то вполне возможно вытащить все нужные запросы
0
6. horoshinkin777 (27.01.19 / 14:21)
Пришелец
@Andrei4ik93, я их итак все могу вытащить. мне интересно этот скрипт норм?
-1
7. ZiGR (27.01.19 / 20:48)
++=>
@horoshinkin777, нет, не норм. MySQL - это реляционная СУБД. Тут ничем подобным не пахнет. Ещё и логины текстовые используются в каждой записи, да?

Как минимум, физическую схему базы данных нужно посмотреть.
И схеме приложить те функции, которые должны быть удовлетворены при помощи предлагаемой схемы.
0
8. horoshinkin777 (28.01.19 / 05:07)
Пришелец
@ZiGR, ниче не понял из твоих слов))
0
9. Вантуз-мен (28.01.19 / 14:33)
Господин ПЖ
@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.19 / 14:33)
0
10. Вантуз-мен (28.01.19 / 14:44)
Господин ПЖ
Explain
Прикрепленные файлы:
экрана от 2019-01-28 14-44-27.png (68.59Kb)
 экрана от 2019-01-28 14-44-27.png
Для выполнения действия необходимо авторизоваться!
Стикеры / Теги / Правила / Топ тем / Топ тем / Поиск