2012-08-12 72 views
0

我有一個表結構,其中我把發送的消息記錄的最近傳入或傳出消息和下面一樣接受;MySQL的選擇不同用戶

Database table structure

member_id1是發送者和member_id2爲接收端。

現在我想要實現的是獲取具有member_id爲3的用戶的最近消息的行。結果應該只包含2行,消息ID爲2和4,爲2是member_id爲3的用戶與member_id爲2的用戶之間的最後一條消息,4是member_id爲3的用戶與member_id爲1的用戶之間的唯一消息。

結果不應該包含message_id爲3的行,因爲它與member_id爲3的用戶沒有任何關係,並且message_id爲1,因爲它已由具有message_id的message_id的消息過期2.

希望我做了清楚我的問題的人誰可以幫我解決這個問題。

回答

1

我想我已經找到了適合自己的問題的正確答案。雖然我不太清楚,但它似乎很好。對於需要解決此類問題的人員;試試這個:

SELECT m1.* 
    FROM table_name m1 
    INNER JOIN (SELECT MAX(senddate) AS senddate, 
        IF(member_id2 = 3, member_id1, member_id2) AS user 
       FROM table_name 
       WHERE (member_id1 = 3 AND delete1=0) OR 
        (member_id2 = 3 AND delete2=0) 
       GROUP BY user) m2 
     ON m1.senddate = m2.senddate AND 
      (m1.member_id1 = m2.user OR m1.member_id2 = m2.user) 
    WHERE (member_id1 = 3 AND delete1=0) OR 
      (member_id2 = 3 AND delete2=0) 
    ORDER BY m1.senddate DESC 
0

的問題是有點模糊,但是從我瞭解你在找這個?

SELECT * FROM table_name WHERE member_id2 = 3 ORDER BY senddate DESC; 
+0

嗨帕布羅......其實並不那麼容易。因爲用戶既可以是發送者也可以是接收者,這意味着查詢不僅應該看到列member_id2,還應該看到member_id1。 – nonkertompf 2012-08-12 13:23:58

+0

在這種情況下 SELECT * FROM TABLE_NAME WHERE member_id2 = 3 OR member_id1 = 3 ORDER BY senddate DESC; – 2012-08-12 13:34:47

+0

但是,這將獲得包含member_id 3的所有行。我們不希望查詢得到過期的行,我們只想要每個收件人最近的行。 – nonkertompf 2012-08-12 13:38:44

0

你可以使用UNION將它們合併

(SELECT * FROM table_name WHERE member_id2 = 3 ORDER BY senddate DESC limit 1) 
union 
(SELECT * FROM table_name WHERE member_id1 = 3 ORDER BY senddate DESC limit 1) 

,或者如果你需要獲得最新的已發送/爲每個成員收到,你可以內部聯接的查詢獲取最大senddate每個:

select * from table_name t1 inner join 
(
select member_id1, null as member_id2, max(senddate) as senddate 
from table_name group by member_id1 
UNION 
select null as member_id1, member_id2, max(senddate) as senddate 
from table_name group by member_id2 
) r ON (t1.member_id1 = r.member_id1 OR t1.member_id2 = r.member_id2) 
AND t1.senddate = r.senddate 
+0

嗨Patrick64 ..您的查詢分別返回消息id 4,1,2,3,2,1。正如你所看到的,不僅它得到了它不應該得到的東西,而且重複了它應該得到的東西。 – nonkertompf 2012-08-12 14:20:07

+0

第一個查詢呢?這是我希望能回答你的問題。我提供了第二個查詢,只是爲了展示如何獲取所有成員的所有最新發送/接收消息,因此我希望它能夠返回重複項。 – Patrick64 2012-08-12 15:29:07

+0

第一個查詢只返回2分的結果,因爲它是有限的,其結果是發送和接收的爲3。member_id用戶,我們希望達成什麼是讓整套派「最後一個」消息的最後消息,並用戶收到member_id爲3的用戶與任何有用戶消息歷史記錄的成員接收。 – nonkertompf 2012-08-12 15:37:11