Я не буду обвинять вас в том, что вы ленивый (боюсь, я не лучше вас в этом отношении), но я согласен с Андреасом Роде в том, что вы должны постараться перечислить необходимые столбцы как как можно чаще. Это может действительно помочь вам увидеть решения, которые в противном случае были бы менее очевидными, если вообще были.
Возьмите, к примеру, вашу нынешнюю проблему. Вам нужен своего рода запрос GROUP BY, который бы игнорировал статус пользователя как отправителя / получателя. Почему, вы могли бы просто заменить отправителя получателем и наоборот, в одном случае, и оставить их неизменными в другом. Рассмотрим это тогда:
SELECT
CASE m_to WHEN '$user_id' THEN m_to ELSE m_from END AS the_user,
CASE m_from WHEN '$user_id' THEN m_to ELSE m_from END AS the_other_party,
date
FROM messages
WHERE m_to = '$user_id'
OR m_from = '$user_id'
Набор результатов будет содержать строки, в которых рассматриваемый пользователь всегда будет возвращаться как the_user
, а другая сторона, ну, как the_other_party
.
Конечно, поскольку мы убедились, что '$user'
возвращается в том же столбце, можно избавиться от первого CASE:
SELECT
'$user_id' AS the_user,
CASE m_from WHEN '$user_id' THEN m_to ELSE m_from END AS the_other_party,
date
FROM messages
WHERE m_to = '$user_id'
OR m_from = '$user_id'
То есть, если вам вообще нужен этот столбец.
В любом случае, теперь вы можете агрегировать набор результатов вышеупомянутого запроса, например, как это:
SELECT
the_user,
the_other_party,
MAX(date) AS max_date
FROM (
SELECT
CASE m_to WHEN '$user_id' THEN m_to ELSE m_from END AS the_user,
CASE m_from WHEN '$user_id' THEN m_to ELSE m_from END AS the_other_party,
date
FROM messages
WHERE m_to = '$user_id'
OR m_from = '$user_id'
) m
GROUP BY
the_user,
the_other_party
Вы также можете присоединиться к последнему запросу в качестве подвыбора к messages
на (messages.m_to = agg.the_user OR messages.m_from = agg.the_user) AND messages.date = agg.max_date
, чтобы получить остальные столбцы.