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

Ребята, я уже сам запутался.

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
наши варики чем не подходят?
 
Они не подходят потому, что не такой результат выдают.:(
 
(SELECT * FROM `your_table` WHERE `idpoluch` = 1 ORDER BY `time` DESC LIMIT 1)UNION(SELECT * FROM `your_table` WHERE `idotpr` = 1 ORDER BY `time` DESC LIMIT 1)
Возможно надо сортировать не по времени, а по инкременационному полю? Если время не очень точное, либо если хочется, чтобы быстрее отрабатывал этот запрос - надо делать так.

Получится так:
(SELECT * FROM `your_table` WHERE `idpoluch` = 1 ORDER BY `id` DESC LIMIT 1)UNION(SELECT * FROM `your_table` WHERE `idotpr` = 1 ORDER BY `id` DESC LIMIT 1)

Но этот вариант выдаст только по 1 строке на отправление и на получение, независимо от того, сколько было собеседников. А я так понял, нужно выдать по паре строк на каждого собеседника? Я бы это сделал, ограничив поля, которые вывожу, и поставив DISTINCT (это будет вместо LIMIT 1)

(SELECT distinct id, idpoluch, idotpr FROM `your_table` WHERE `idpoluch` = 1 ORDER BY `id` DESC)UNION(SELECT distinct id, idpoluch, idotpr FROM `your_table` WHERE `idotpr` = 1 ORDER BY `id` DESC)
Для того, чтобы получить и текст сообщений, думаю, придется попотеть. Например можно из этого запроса создать view, а уже его объединять с таблицей.

Нет, так не получится :(. id то везде разный :(

Придется, наверное, делать хранимой процедурой. Не думаю что это проблема. Хранимые процедуры работают на раз-два. У самого на престу добавлена парочка, так что 100тыс товаров обрабатывает за 20 сек.
 
Последнее редактирование модератором:
Спасибо за интересную задачу. Я так понял надо было выбрать последние сообщения в диалогах пользователем с id =1. Вот готовое решение (цифру 1 меняете на нужного пользователя:(
----------
select m.* from messages m join (select max(id) as id,case when idpoluch=1 then idotpr else idpoluch end from messages
where idpoluch =1 or idotpr = 1
group by case when idpoluch=1 then idotpr else idpoluch end) mm on m.id = mm.id
----------
 
Попробуй вот так:
Код:
SELECT t1.* FROM ((SELECT
  your_table.id,
  your_table.message,
  your_table.idotpr AS idcontact,
  your_table.idpoluch,
  your_table.idotpr,
  your_table.time,
  1 AS isincoming
FROM your_table
WHERE your_table.idpoluch = 1)
UNION
(
  SELECT
  your_table.id,
  your_table.message,
  your_table.idpoluch AS idcontact,
  your_table.idpoluch,
  your_table.idotpr,
  your_table.time,
  0 AS isincoming
FROM your_table your_table
WHERE your_table.idotpr = 1)ORDER BY time DESC) AS t1
GROUP BY idcontact
 
Да, union неплохой вариант. Нобудет fullscan.
Вопрос решен или нужна ещё помощь?
 
Назад
Сверху