[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вложенный запрос
lexus1990
Есть таблица сообщений.

Поля: id | id_user_from | id_user_to | date_time

Как 1 вложенным запросом выбрать все последние сообщения от всех пользователей к одному. Т.е. отсортировать (WHERE id_user_from = user or id_user_to = user) а внутри этой выборки MAX(date_time)



Спустя 37 минут, 42 секунды (2.05.2012 - 13:06) Guest написал(а):
SELECT * FROM tblname WHERE id_user_to = $user_receiver ORDER BY date_time DESC LIMIT 7

не?

Спустя 4 минуты, 55 секунд (2.05.2012 - 13:11) lexus1990 написал(а):
смысл в другом. В твоем случае получится так: если последние 10 сообщений были написаны между 2-мя людьми, то остальные переписки не выведутся.
Смысл сделать как вконтакте. Чтобы вывести последнее сообщение из каждой ветки переписки.

Спустя 48 секунд (2.05.2012 - 13:12) lexus1990 написал(а):
Я переписываюсь с 10-ю людьми. В последние 2 дня я переписывался только с 3-мя. В результате запроса я должен получить:
10 последних сообщений по 1 из каждой переписки (неважно, я последний писал, или мне), отсортированных по времени. Т.е.

1. Вася: (он ответил) через 10 минут выхожу
2. Игорь: (мое сообщение последнее) как поживает твоя бабушка
3. Ренат: (он ответил) скоро буду
и т.д.

Спустя 19 минут, 11 секунд (2.05.2012 - 13:31) Guest написал(а):
Не совсем так, в запросе выше - будут все юзеры которые писали Тебе.

Т.е. юзер А, Б и В
идёт сообщения:
А->Б
А->В
Б->А
Б->В
В->А
В->Б

тебе надо все сообщения которые идут к Б к примеру, запрос выше вернёт:

А->Б и В->Б.

Если надо и все исходящии запросы от Б, тогда запрос будет иметь вид:

SELECT * FROM tblname WHERE 
id_user_to = $user_receiver or id_user_from = $user_receiver
ORDER BY date_time DESC LIMIT 7


Сие вернёт:
А->Б, В->Б, Б->А, Б->В

Спустя 4 часа, 52 минуты, 25 секунд (2.05.2012 - 18:23) lexus1990 написал(а):
SELECT * from table WHERE (id_user_from = A and id_user_to = B) OR (id_user_from = B and id_user_to = A)

Это вернет переписку А и B.
SELECT * from table WHERE (id_user_from = A OR id_user_to = A)

Это вернет все сообщения с юзером А

Так в итоге надо получить по одному сообщению от каждой переписки. Т.е. я переписывался с 10-ю людьми. На выходе из запроса у меня должно быть 10 сообщений.

Спустя 46 минут, 42 секунды (2.05.2012 - 19:10) ИНСИ написал(а):
Добавь группировку: GROUP BY

Спустя 4 минуты, 21 секунда (2.05.2012 - 19:14) lexus1990 написал(а):
Это зачем? GROUP by по какому полю?
Я, конечно, могу сделать по 1 запросу на каждого пользователя, но если их будет 100 - это будет просто аврал)

Спустя 1 час, 23 минуты, 52 секунды (2.05.2012 - 20:38) TMake написал(а):
Цитата (lexus1990 @ 2.05.2012 - 21:14)
Я, конечно, могу сделать по 1 запросу на каждого пользователя, но если их будет 100

Так запрос динамически составляй и не каких 100 запросов тебе не нужно будет.

Спустя 1 час, 39 минут, 34 секунды (2.05.2012 - 22:18) ИНСИ написал(а):
Цитата
SELECT * FROM tblname WHERE id_user_to = $user_receiver ORDER BY date_time DESC LIMIT 7

Тебе уже дали решение, надо в него просто добавить группировку, примерно так:
SELECT * 
FROM `tblname`
WHERE `id_user_to` = {$user_receiver}
GROUP BY `id_user_from`
ORDER BY `date_time` DESC
LIMIT
7

Спустя 8 часов, 59 минут, 30 секунд (3.05.2012 - 07:17) lexus1990 написал(а):
Я дошел до решения с помощью друга. Ваш запрос не дает нужного результата. Нужно 2 запроса:
1.
SELECT * FROM wds_message WHERE id IN (SELECT MAX(id) FROM wds_message GROUP BY id_user_to) && id_user_from = '$user_id' ORDER BY date_time

2.
SELECT * FROM wds_message WHERE id IN (SELECT MAX(id) FROM wds_message GROUP BY id_user_from) && id_user_to = '$user_id' ORDER BY date_time


Первый возвращает последнее сообщение от user к пользователям. Второе наоборот. Сравнивая на php даты и склеивая массивы получается верный результат.

Спустя 1 час, 38 минут, 53 секунды (3.05.2012 - 08:56) sergeiss написал(а):
Если честно, то не вникал во все тонкости темы, просто кое-что прокомментирую.
Цитата (lexus1990 @ 3.05.2012 - 09:17)
Ваш запрос не дает нужного результата. Нужно 2 запроса:

Даже если тебе действительно нужны эти 2 запроса, то "сджойни" их и получишь один запрос, чуть более сложный. На ПХП ты просто возьмешь результат, не надо будет ничего сравнивать и "склеивать". Это всё будет прекрасно сделано внутри БД.
Быстрый ответ:

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