За последние 24 часа нас посетили 15614 программистов и 1551 робот. Сейчас ищут 898 программистов ...

Сложный запрос в БД. Личные Сообщения.

Тема в разделе "PHP и базы данных", создана пользователем Karamba666, 7 янв 2017.

  1. Karamba666

    Karamba666 Новичок

    С нами с:
    22 окт 2016
    Сообщения:
    6
    Симпатии:
    0
    Всем привет. Создаю на сайте личные сообщения в виде диалогов.
    Имеется таблица im с полями:
    id - индекатор
    user_from - имя отправителя
    id_from - id отправителя
    user_to - имя получателя
    id_to - id получателя
    text - текст письма
    date - дата отправки
    see - просмотрено ли сообщение (знач. 0 и 1)

    Возник следующий вопрос... Как просканить таблицу, и выводить имена тех, с кем была переписка?
    Вот мой код...
    P.S. Переменная login это мой ник :)
    PHP:
    1. $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");
    2. while($result = mysql_fetch_array($sql)) {
    3. echo"$result[user_from]<br>";
    4. }
    Всё вроде работает, то проблема в том, что имена с темми с кем я переписывался будут дублироваться, так как имя переписчика может быть и в user_from и в user_to... В этом и проблема :(
    Объеденить в запросе эти 2 поля я не умею :(

    И второй вопросик... Правильно ли я вообще делаю? Или же при наличии в таблице пару миллионов строк, моя БД рухнет? так как мне приходится постоянно селектить всю таблицу, чтобы найти всех челов с кем была переписка?
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    В фильтрах запроса используйте не логин а идентификатор пользователя ("Id_from, Id_to" в вашем примере).
    Это только вы знаете. Требования к приложению вы не озвучивали. В любом случае, какой бы не была реализация, в запросе должны присутствовать ограничители на количество извлекаемых записей (LIMIT)
     
  3. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    не много не понял этой фразы - человек пишет сам себе ?
    на сколько я знаю любая внутрення переписка это диалог 1 на 1 ..

    например

    вася с федя
    федя с вася

    можно предположить что есть групповой чат - но тут по полям не проходите


    почему не просто вот так ?

    Код (Text):
    1. WHERE user_from!= '$login' or user_to = '$login'
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Боюсь, что LIMIT работает не так. Это не "найди только N результатов и верни мне", это "найди ВСЕ результаты, а мне верни только N из них". На большой базе нужна индексация грамотная. Тогда все будет работать как надо.
     
  5. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    стоп-стоп. Я и не утверждал конечно что LIMIT сам по себе влечет к обработке СУБД лишь записей равному количеству записей в LMIT. Разумеется если не будет индекса, то будет фулскан таблицы для возврата лимитированного числа записей. В данном случае, нужен будет индекс на поля в условии WHERE тса, на которые, вероятнее всего будет ещё и сортировка ORDER BY (в идеале). Если сортировка на другое поле то (тут уже по ситуации) вероятно нужен будет индекс на поле сортировки для оптимизации скорости.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ок, просто это частое заблуждение, что использование лимита снижает нагрузку на БД, мол выборка останавливается на определенном количестве.
     
  7. warriors88

    warriors88 Новичок

    С нами с:
    15 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    А зачем записывать имена? Не проще их выводить из таблицы пользователей по id?