2011-11-04 75 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