PHP mysql Distinct,只加载1组id


PHP mysql Distinct, only load 1 set of ids

我试图获得数据的顺序与唯一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
  1. 此查询显示每个记录的两个字段。
  2. 如果第一个字段大于或等于userid2,则显示userid1,否则显示userid2
  3. 第二个字段具有相反的逻辑
  4. 这确保了两个相似的结果集总是以相同的方式排序,因此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命令行运行我的测试....