[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложный запрос в БД. Личные Сообщения
Karamba666
Всем привет. Создаю на сайте личные сообщения в виде диалогов.
Имеется таблица im с полями:
id - индекатор
user_from - имя отправителя
id_from - id отправителя
user_to - имя получателя
id_to - id получателя
text - текст письма
date - дата отправки
see - просмотрено ли сообщение (знач. 0 и 1)

Возник следующий вопрос... Как просканить таблицу, и выводить имена тех, с кем была переписка?
Вот мой код...
P.S. Переменная login это мой ник :)
$sql = mysql_query("SELECT user_from FROM `im` WHERE user_from != '$login' and user_to = '$login' or user_to != '$login' and user_from = '$login' GROUP BY user_from ORDER BY date DESC");
while($result = mysql_fetch_array($sql)) {
echo"$result[user_from]<br>";
}


Всё вроде работает, то проблема в том, что имена с темми с кем я переписывался будут дублироваться, так как имя переписчика может быть и в user_from и в user_to... В этом и проблема :(
Объеденить в запросе эти 2 поля я не умею :(

И второй вопросик... Правильно ли я вообще делаю? Или же при наличии в таблице пару миллионов строк, моя БД рухнет? так как мне приходится постоянно селектить всю таблицу, чтобы найти всех челов с кем была переписка?
sergeiss
Karamba666, если честно, твой запрос мне кажется неправильным.
SELECT user_from 
FROM `im`
WHERE user_from != '$login' and user_to = '$login' or user_to != '$login' and user_from = '$login'
GROUP BY user_from
ORDER BY date DESC

Давай его распишем словами.
1. Выбрать все строки (все сообщения), где либо user_from, либо user_to равен '$login'.
2. Взять оттуда только поле user_from
3. Убрать дублированные значения (GROUP BY).
4. Зачем-то отсортировать по дате (Зачем? Ты же дату ответа не выбираешь).

При этом будь у тебя хоть 100500 сообщений, где user_from='$login', ты из них оставишь только одно. А все остальные строки будут выбраны зря. И плюс к ним будут добавлены все (за исключением дублей) строки, у которых $user_to='$login'

Вобщем, мне видится скорее такой запрос:
select distinct user_from
from im
where user_to = '$login'
UNION
select
user_from
from im
where user_from = '$login'
limit 1

Первая часть выберет всех (уникальных) юзеров, которые писали этому $login, вторая часть найдет (при его наличии) единственное сообщение, написанное самим юзером.
Затем UNION объединит эти 2 части.

Насчет "рухнет ли таблица". При наличии правильных индексов не рухнет :)

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
T1grOK
Цитата (sergeiss @ 7.01.2017 - 13:49)
Первая часть выберет всех (уникальных) юзеров, которые писали этому $login, вторая часть найдет (при его наличии) единственное сообщение, написанное самим юзером.
Затем UNION объединит эти 2 части.

Да, только во втором запросе нужно выбрать user_to, а то получается каламбур, выбери мне меня же)


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
sergeiss
Цитата (T1grOK @ 7.01.2017 - 18:59)
Да, только во втором запросе нужно выбрать user_to, а то получается каламбур, выбери мне меня же)

Нет, не каламбур smile.gif Там же может и не быть сообщений вообще. Если юзер ничего не отправлял.
Но пусть ТС решает, что ему надо. Я высказал свои соображения.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Karamba666
sergeiss, Спасибо, только зачем сообщения ещё выводить? мне сообщения выводить не нужно)
А сортировка наверное лучше по ИД сделать да? а не по дате...


Вообщем посидев пол дня, я написал вот это))
SELECT DISTINCT *
FROM `im`
WHERE user_from = '$login' or user_to = '$login'
ORDER BY id DESC


Но проблема появилась в другом мне помимо вывода логинов с которым я переписываюсь, нужно ещё проверять see(причитано сообщение или нет)

Пример:
maxim: !Новое сообщение (прочитать)!
alex007: ваше сообщение ещё не прочитано пользователем alex007
boyareshnik: Сообщение прочитано
big_bob: Сообщение прочитано
sergeiss
Цитата (Karamba666 @ 7.01.2017 - 20:21)
Спасибо, только зачем сообщения ещё выводить? мне сообщения выводить не нужно)

Ну так в том примере, что я написал, сообщения и не выводятся никакие.

Цитата (Karamba666 @ 7.01.2017 - 20:21)
А сортировка наверное лучше по ИД сделать да? а не по дате...

А вот в последнем из показанных тобой запросов да, выбирается всё, в т.ч. сообщения.

Но вот что тебе надо выбирать/выводить на самом деле, я не знаю smile.gif Я писал свой пример на основе того, как я понял твои пожелания.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.