Поля: 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. Ренат: (он ответил) скоро буду
и т.д.
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 запросу на каждого пользователя, но если их будет 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.
2.
Первый возвращает последнее сообщение от user к пользователям. Второе наоборот. Сравнивая на php даты и склеивая массивы получается верный результат.
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 запроса, то "сджойни" их и получишь один запрос, чуть более сложный. На ПХП ты просто возьмешь результат, не надо будет ничего сравнивать и "склеивать". Это всё будет прекрасно сделано внутри БД.