Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Сложный запрос в БД. Личные Сообщения
Karamba666  
 ۩     Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43513
На форуме: 8 месяцев, 3 дня
Карма:




Всем привет. Создаю на сайте личные сообщения в виде диалогов.
Имеется таблица 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 поля я не умею :(

И второй вопросик... Правильно ли я вообще делаю? Или же при наличии в таблице пару миллионов строк, моя БД рухнет? так как мне приходится постоянно селектить всю таблицу, чтобы найти всех челов с кем была переписка?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




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 части.

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

Это сообщение отредактировал sergeiss - 7.01.2017 - 17:55


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
T1grOK  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2789
Пользователь №: 24406
На форуме: 6 лет, 8 месяцев, 9 дней
Карма: 180




Цитата (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
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Цитата (T1grOK @ 7.01.2017 - 18:59)
Да, только во втором запросе нужно выбрать user_to, а то получается каламбур, выбери мне меня же)

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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Karamba666  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43513
На форуме: 8 месяцев, 3 дня
Карма:




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


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


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

Пример:
maxim: !Новое сообщение (прочитать)!
alex007: ваше сообщение ещё не прочитано пользователем alex007
boyareshnik: Сообщение прочитано
big_bob: Сообщение прочитано
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Цитата (Karamba666 @ 7.01.2017 - 20:21)
Спасибо, только зачем сообщения ещё выводить? мне сообщения выводить не нужно)

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

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

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

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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса