2012-11-14 31 views
1

我想從以下數據庫的某些字段:
如何從MySQL表只檢索唯一條目

CREATE TABLE `messages` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `message` text, 
    `date` datetime DEFAULT NULL, 
    `fra` int(11) DEFAULT NULL, 
    `til` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; 


弗拉=發件人ID;
直到=接收ID

這已例如這個值:

(1, 'This is a message for Obama', '2012-11-14 01:12:06', 1, 3), 
(2, 'Hello John! How are you?', '2012-11-14 01:23:43', 3, 1), 
(3, 'Hey Jack', '2012-11-14 01:28:11', 1, 2), 
(4, 'How are you son?', '2012-11-14 01:28:15', 1, 2), 
(5, 'everything allright for you?', '2012-11-14 01:28:23', 1, 2); 


我想從數據庫中獲取的字段的方式是在如下:
我想要得到的唯一對話從一個用戶到另一個用戶。如果用戶1向用戶3發送了消息,並且用戶3對用戶1進行了回覆,那麼我只想選擇數據庫中的最後一個字段;或者,如果用戶1已派出3個消息給用戶2,那麼我想只得到3日消息,用戶2,從用戶1 因此,這意味着我應該只得到2行作爲結果

我曾嘗試:

SELECT DISTINCT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' GROUP BY fra,til" 



"SELECT DISTINCT(til) AS til FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' ORDER BY id DESC" 

,但我無法得到我想要的結果。

有人可以解釋我該怎麼做?

編輯:我只想建立線程用戶消息的,將顯示兩個用戶(這是查詢的範圍)

回答

2

下面是對SQL接聽/例子聲明:http://sqlfiddle.com/#!2/ae56b/10

select * 
from messages m1 
where m1.date = (select max(m2.date) 
    from messages m2 
    where 
    case when m2.fra < m2.til then m2.fra else m2.til end = 
    case when m1.fra < m1.til then m1.fra else m1.til end 
    and 
    case when m2.fra > m2.til then m2.fra else m2.til end = 
    case when m1.fra > m1.til then m1.fra else m1.til end 
); 
+0

只在任何兩方之間獲得最新消息。 – marvin

+0

是的。這很好。現在我需要獲取當前用戶和另一個用戶之間的消息。當前用戶由$ _SESSION ['userid']變量 – roshkattu

+1

@roshkattu定義 - 只要刪除最後一個分號並在當前用戶爲'3'的情況下添加'和(fra = 3或者直到3)'。 – marvin

1

這不是真正的DISTINCT的情況之間發送的最後一條消息,它更您想要將結果限制爲1條記錄的情況。試試這個:

SELECT * FROM messages WHERE fra='".$_SESSION['userid']."' OR til='".$_SESSION['userid']."' ORDER BY `date` DESC LIMIT 1 
+0

我也試過做一個限制。但是您不能將查詢限制爲1行,因爲如果我有例如5個用戶將消息發送給對方,限制1將只顯示一條記錄,而不是它應該顯示的唯一記錄。 – roshkattu

+0

好的,對不起,我誤解了。 –

+0

我只想構建**線程**的用戶消息,它將顯示兩個用戶之間發送的最後一條消息 – roshkattu

0

我想你可以使用一種「鍵=>值」集合效仿

你的查詢可以

SELECT @discution := (MAX(til,Fra)+","+MIN(til,Fra)) AS key , messages.* FROM messages 
ORDER BY id DESC LIMIT 1 OFFSET 0 GROUP BY @discution 
2

我想你可以使用group-by也可以得到這些值..

select * from消息其中的ID in(從fra ='「的消息中選擇max(ID)。$ _ SESSION ['userid']。」'OR til =' 「。$ _ SESSION ['userid']。''GROUP BY fra,直到)

+0

+1,I認爲這應該給你你想要什麼後再讀你的問題roshkattu。 –