Если ваша цель - получить разные пары, вы можете сделать следующее, чтобы получить меньшую из пар всегда в левом столбце, а большую - в правую, таким образом гарантируя, что разные пары работают:
SELECT DISTINCT
(id1 - ( (id1 - id2) + abs(id1 - id2) ) * .5) as first,
(id2 + ( (id1 - id2) + abs(id1 - id2) ) * .5) as second
FROM messages ORDER BY date;
Поскольку пары всегда расположены, нет необходимости в каких-либо функциях сопряжения.
Пример
+------+------+--------+------------+
| id1 | id2 | val | pair_date |
+------+------+--------+------------+
| 4 | 5 | test 1 | 2010-12-25 |
| 5 | 4 | test 2 | 2011-10-31 |
| 17 | 50 | test 3 | 2011-07-04 |
| 50 | 17 | test 4 | 2001-01-01 |
+------+------+--------+------------+
Если я выполню этот запрос:
SELECT DISTINCT
(id1 - ( (id1 - id2) + abs(id1 - id2) ) * .5) AS first,
(id2 + ( (id1 - id2) + abs(id1 - id2) ) * .5) AS second
FROM pairs ORDER BY pair_date;
Я получаю:
+-------+--------+
| first | second |
+-------+--------+
| 4.0 | 5.0 |
| 17.0 | 50.0 |
+-------+--------+
2 rows in set (0.00 sec)
Очевидно, что использование логического значения имеет тот же эффект, его легче читать и, вероятно, быстрее, но приведенный выше алгоритм удобен, если вам просто нужно поменять местами два числа, чтобы одна сторона всегда была меньше.
Я не уверен, почему вы получили ошибку. Я запускаю свои тесты прямо из командной строки MySQL ....