У меня есть таблица SQL с именем private_messages с полями (id, from, to, message, stamp). поле штампа соответствует дате сообщения
Итак, какой запрос мне нужен:
1) получить разговор между двумя пользователями (упорядочен по дате)?
Я попробовал запрос
(SELECT * FROM private_messages WHERE from=$my_id AND to=$other_id) UNION (SELECT * FROM private_messages WHERE from=$other_id AND to=$my_id) ORDER BY stamp ;
но не работает …
2) получать последние сообщения между мной и другими пользователями, каждый с другим пользователем, упорядоченным по дате (например, для создания почтового ящика, например, в faceebook)?
1.)
SELECT * FROM private_messages a WHERE (a.from = $my_id AND a.to = $other_id) OR (a.from = $other_id AND a.to = $my_id) ORDER BY stamp DESC
2.)
SELECT f.* FROM ( SELECT * FROM private_messages a WHERE (LEAST(a.from, a.to), GREATEST(a.from, a.to), a.stamp) IN ( SELECT LEAST(b.from, b.to) AS x, GREATEST(b.from, b.to) AS y, MAX(b.stamp) AS msg_time FROM private_messages b GROUP BY x, y ) ) f WHERE $my_id IN (f.from, f.to) ORDER BY f.stamp DESC
Можете ли вы попробовать это?
SELECT x.* FROM (SELECT * FROM private_messages WHERE `to`='$my_id' OR `from`='$my_id' GROUP BY `to`, `from`) AS x ORDER BY x.stamp DESC ;
To
, From
могут быть зарезервированы слова . Заметил, что x
является псевдонимом таблицы.
Я сделал это в прошлом, но с простым запросом. Может быть, это сработает для вас
SELECT * FROM private_messages WHERE (from=$my_id AND to=$other_id) OR (from=$other_id AND to=$my_id) ORDER BY stamp
1) Довольно уверен, что вам нужны котировки вокруг ваших переменных PHP, например:
(SELECT * FROM private_messages WHERE from='$my_id' AND to='$other_id') UNION (SELECT * FROM private_messages WHERE from='$other_id' AND to='$my_id') ORDER BY stamp DESC
2) Попробуйте что-то вроде:
SELECT * FROM (SELECT * FROM private_messages WHERE to='$my_id' OR from='$my_id' GROUP BY to, from) AS tmp_table ORDER BY stamp DESC