我试图获得数据的顺序与唯一id无关。所以我的查询语句是
SELECT DISTINCT id1, id2 FROM messages ORDER BY date
如果我有一个包含以下数据的数据库:
id1 | id2 | date
5 | 6 | 1/2/2011
6 | 5 | 1/1/2011
我只需要用最新的日期加载列,因为id是相同的2个人。我必须加载id其中一个id是你的所以我现在真正的查询是
SELECT DISTINCT userid_1, userid_2
FROM messages
WHERE userid_2=$dbid
OR userid_1=$dbid
ORDER BY date
和我得到的结果为[6 5] [5 9] [9 5] [5 15] [5 6] [5 17]
结果2和3相同,1和5相同。实际上只需要查询4个结果。谢谢!
一个选项是:
SELECT DISTINCT
if(userid_1 >= userid_2,userid_1, userid_2) AS 'id1',
if(userid_1 >= userid_2,userid_2, userid_1) AS 'id2'
FROM messages
WHERE userid_2=$dbid OR userid_1=$dbid ORDER BY date
- 此查询显示每个记录的两个字段。
- 如果第一个字段大于或等于userid2,则显示userid1,否则显示userid2
- 第二个字段具有相反的逻辑
- 这确保了两个相似的结果集总是以相同的方式排序,因此
DISTINCT
将认为它是相同的。
如果您的目标是获得不同的配对,您可以执行以下操作,使配对中较小的始终在左列,较大的始终在右列,从而确保不同的工作:
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命令行运行我的测试....
标题>