2011-11-04 37 views
5

我试图获取数据,其中订单与独特的ID无关紧要。所以,简单地我的查询将PHP mysql独特,只加载1组ID

SELECT DISTINCT id1, id2 FROM messages ORDER BY date 

如果我有以下数据的数据库:

id1 | id2 | date 
5 | 6 | 1/2/2011 
6 | 5 | 1/1/2011 

我只需要,因为IDS是相同的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个结果应该被查询。谢谢!

回答

2

一种选择是:

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. 该查询显示了每个记录两个字段。如果它是大于或等于userid2
  2. 第一字段将被userid1,否则将显示userid2
  3. 第二场具有相反的逻辑
  4. 这使得结果确保两个类似的集将alwas订购相同所以DISTINCT会认为它一样。
+0

由于某种原因,如果我这样做,它会加载正确的行数,但它实际上不会获得任何数据。它只是显示[] [] [] []在那些应该显示我被加载的ID。 如果($结果> 0){ \t而($行= mysql_fetch_assoc($查询)){ \t \t回声 “[”。$行[ '采用UserID_1']。””。$行[ 'userid_2' ]。“]”; \t} } –

+0

nvm,忘记了您需要在括号中放置[if(userid_1> = userid_2,userid_1,userid_2)]。 –

+0

它完美的作品,但如果你不介意,你可以向我解释这是如何工作的,因为我不太清楚我的理解。 –

1

如果你的目标是让不同的配对,你可以做到以下几点,以获得对较小总是在左栏到右侧较大,从而确保不同作品:

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命令行运行我的测试....

+0

谢谢,我已经知道了,但我把它放在看看它是否也工作,它使mysql_num_rows错误。我没有发现它是哪个错误,因为我已经有了一个工作方式,我很好奇你的工作是否也可以。 (userid_1> = userid_2,userid_1,userid_2),if(userid_1> = userid_2,userid_2,userid_1)FROM消息WHERE userid_2 = $ dbid或userid_1 = $ dbid ORDER BY日期DESC“ –

+0

我绝对测试过它,因为我知道它有点奇怪。有很多括号,给混淆留下了空间......而且,由于除以2,所以这些值被返回为双数。另一方面是我的测试中实际上没有日期字段。我认为这不重要。我会添加一些并发布我的测试。 – Anthony

+0

感谢您试用它,并给我反馈。让我知道它是否有效或派上用场。 – Anthony