Как убрать повторяющиеся блоки с собесдником?

Всем доброго времени суток! Подскажите пожалуйста, как вывести по блоку на каждый диалог, при этом, чтобы противоположные комбинации собеседников не повторялись.
Сам код:
$dialogs = mysql_query("SELECT *,COUNT(id) as count FROM `messages`
WHERE `from` = '$my_id' OR `to` = '$my_id'
GROUP BY `to`,`from` ORDER BY `date` DESC") or die(mysql_error());
	while ($row = mysql_fetch_assoc($dialogs)) {
		$my_id = $user_data['user_id'];
		if($my_id === $row['to']) {
			echo "mnie";
			$to_me = '1';
				$to_id = $row['from'];
			?>

			<?php
		}if($my_id != $row['to']) {
			echo "nie mnie";
			$not_to_me++;
			$to_id = $row['to'];
		}
			?>
			<a href='?to=<?php echo $to_id;?>' style='text-decoration:none;'>
			link
			</a>
			<?php
		
		echo $row['from'];
		echo "->";
		echo $row['to'];
		echo "<br>";
	}

и то, как это выглядит:
xCfdFyy642rE_cBz1ny_wIbXxyGN3QI98Mdo7DwO

при этом ссылки формируются правильно, то есть, на страницу ?to=$id я попадаю, на правильный диалог. Я под номером(7).
Заранее спасибо!
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ответы на вопрос 1
copist
@copist
Empower people to give
Возможно, это тестовый пример чата. Первая реализация.
Что ты хотел показать в списке сообщений? Все сообщения, которые кто-то кому-то написал? Тогда он работает правильно. Счётчик только не используется и зачем то в таблице есть dialog_id, но ты его тоже не используешь, а вместо этого группируешь по from + to.

Я бы для удобства визуально чат по-другому построил.
Посмотри вот на такой мокап https://icons8.com/2015/07/17/icons8-wpf-ui-framework/, точнее вот этот экран take.ms/5F5rr
С левой стороны список контактов, кому недавно писал ты или кто ответил тебе.
Для его построения нужен такой запрос
SELECT DISTINCT A.`user_id`
FROM(
   SELECT m1.`from` as `user_id`, m1.`date` FROM `messages` m1 WHERE m1.`to` = 7
   UNION
   SELECT m2.`to` as `user_id`, m2.`date` FROM `messages` m2 WHERE m2.`from` = 7
   ORDER BY `date` DESC
) A

То есть список собеседников в порядке убывания даты последнего сообщения.
Если нужен счётчик сообщений, то посчитать по каждому собеседнику или диалогу.
Если нужен счётчик непрочитанных сообщений, то нужно по каждому собеседнику или диалогу хранить идентификатор последнего прочитанного сообщения и считать количество сообщений с идентификатором больше этого.

Может быть это и много запросов в базу, но я был сделал их разными под каждый нужный элемент.
Под список собеседников + счётчик сообщений - один запрос
Если нужен счётчик непрочитанных сообщений, то второй запрос или серия запросов, хотя можно попробовать и в первый уместить.
Под сообщения чата конкретного диалога - третий запрос.

Как тестовый пример - норм. Вопросов нет.
Если в пром эксплуатации, то хранить отдельные сообщения в реляционной базе накладно. Слишком много записей в таблицах. Желательно использовать NoSQL базу и хранить в одной записи базы один диалог целиком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы