Вывод с объединением. mySql

Тема в разделе "Базы данных", создана пользователем Sankaboy, 18 апр 2015.

Модераторы: latteo
  1. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Привет ребята! Есть таблица мускула с архитектурой:
    id | message | idpoluch | idotpr | time
    0 | message1 | 1 | 2 | time
    1 | message2 | 1 | 2 | time
    2 | message3 | 2 | 1 | time
    3 | message4 | 1 | 2 | time
    4 | message5 | 5 | 4 | time
    5 | message6 | 4 | 5 | time
    6 | message7 | 1 | 4 | time
    7 | message8 | 4 | 1 | time

    id - AUTO_INCREMENT
    message - text - текст сообщения
    idpoluch, idotpr - int - id получателя и отправителя
    time - datatime

    А так же существует переменная в php, которая содержит мой id = 1.

    Мой id в таблице может содержаться в полях idpoluch, idotpr, но ни как не одновременно в обоих. Т.е. в одном из них мой, в другом чужой.
    Нужно сгруппировать поля и вывести по одной последней строке из каждой серий диалогов.

    С приведенного примера таблицы, id = 1 общался только с двумя другими id. Значит у меня должно вывестись тольке 2 строки с последним сообщением.

    Честно признаюсь - не хватает мозгов для решения.
    За ранее спасибо!
     
  2. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    не так?
    Код:
    SELECT * FROM `table` WHERE `idpoluch` = 1 OR `idotpr` = 1 ORDER BY id DESC LIMIT 1
    А если LIMIT 2 попробуй. получится 2

    сорь, я хочу помочь но возможно немного не понял что нужно. приведи пример боевой. и для чего это. и какой должен быть вывод.
     
    Последнее редактирование модератором: 18 апр 2015
    latteo нравится это.
  3. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Нет, выведет только 1 запись :). Надо что-то с GROUP BY творить:crazy:

    А если переписок тысячи?) Не в лимите дело, а в группировке скорее всего.
     
    Последнее редактирование модератором: 18 апр 2015
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.402
    Симпатии:
    1.183
    Пишется 2 запроса, но с разными колонками под вашего пользователя и объединяется через UNION
    Скобки нужны из-за ORDER BY и LIMIT в каждом из запросов:
    PHP:
    (SELECT FROM `your_tableWHERE `idpoluch` = 1 ORDER BY `timeDESC LIMIT 1)
    UNION
    (SELECT FROM `your_tableWHERE `idotpr` = 1 ORDER BY `timeDESC LIMIT 1)
     
    ZiX нравится это.
  5. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    latteo, выводит так же так и пример ZiX-а. Это все я пробовал. Возможно я не корректно пояснил вопрос.

    Имеется заполненная таблица:

    id | message | idpoluch | idotpr | time
    0 | message1 | 1 | 2 | 1:00
    1 | message2 | 1 | 2 | 1:10
    2 | message3 | 2 | 1 | 1:11
    3 | message4 | 1 | 2 | 1:12
    4 | message5 | 5 | 4 | 1:00
    5 | message6 | 4 | 5 | 1:01
    6 | message7 | 1 | 4 | 1:02
    7 | message8 | 4 | 1 | 1:03

    Нужно получить в результате 3 диалога:
    3 | message4 | 1 | 2 | 1:12
    4 | message5 | 5 | 4 | 1:01
    7 | message8 | 4 | 1 | 1:03

    ПС. выводить последние по времени и не важно кто кому его отправлял. Диалогов может быть больше.
     
  6. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    так по времени или только id = 1?
     
  7. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    По времени сортируется именно последнее сообщение из переписки, а ИД выбирается юзер, который либо отсылал либо принимал сообщение.

    Предпоследнее мое сообщ. ярко показывает какой должен быть рез.
     
  8. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.402
    Симпатии:
    1.183
    Откуда появится строка 4 | message5 | 5 | 4 | 1:01, если id = 1?
     
  9. ZiX

    ZiX Коддинг, Парсинг

    Moderator
    Регистр.:
    9 июл 2011
    Сообщения:
    1.378
    Симпатии:
    562
    я поэтому и спросил время иль ид?
    Тогда 2 строки должно быть.

    Так а что в наших вариантах не так? Чем не подходят?
     
  10. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Ребята, я уже сам запутался.

    id = 1

    id | message | idpoluch | idotpr | time
    0 | message1 | 1 | 2 | 1:00
    1 | message2 | 1 | 2 | 1:10
    2 | message3 | 2 | 1 | 1:11
    3 | message4 | 1 | 2 | 1:12
    4 | message5 | 3 | 1 | 1:00
    5 | message6 | 1 | 3 | 1:01
    6 | message7 | 1 | 4 | 1:02
    7 | message8 | 4 | 1 | 1:03
    8 | message8 | 4 | 6 | 1:03
    9 | message8 | 7 | 4 | 1:03

    Должен быть рез.:
    1 | message4 | 1 | 2 | 1:12
    2 | message6 | 1 | 3 | 1:01
    3 | message8 | 4 | 1 | 1:03