2017-02-26 47 views
0

我有2個表來表示一個對話,我認爲這是一個非常標準的格式。休眠查詢獲取2個用戶之間的現有對話

CREATE TABLE conversation (
    id INT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(40) DEFAULT '', 
    last_modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY(id) 
) ENGINE = InnoDB; 

CREATE TABLE conversation_user (
    user_id INT NOT NULL, 
    conversation_id INT NOT NULL, 
    conversation_is_visible BOOLEAN NOT NULL DEFAULT TRUE, 
    unread BOOLEAN NOT NULL DEFAULT TRUE, 
    PRIMARY KEY (user_id, conversation_id), 
    CONSTRAINT fk_conversation_user_user_id FOREIGN KEY (user_id) REFERENCES user (id), 
    CONSTRAINT fk_conversation_user_conversation_id FOREIGN KEY (conversation_id) REFERENCES conversation (id) 
) ENGINE = InnoDB; 

我希望能夠檢查用戶(我不關心開始一個新的對話超過2級的用戶,如果它已經存在)之間存在的對話。

我似乎無法編寫查詢來選擇只有2個給定用戶的對話,也沒有更多。 然後我想將查詢轉換成一個hibernate查詢。

例如如果我有如下的數據:

select * from conversation; 
+----+------------------------+---------------------+ 
| id | name     | last_modified  | 
+----+------------------------+---------------------+ 
| 1 | test conversation 1 | 2017-02-25 15:39:01 | 
| 2 | test conversation 2 | 2017-02-26 16:29:14 | 
+----+------------------------+---------------------+ 

select * from conversation_user; 
+---------+-----------------+-------------------------+--------+ 
| user_id | conversation_id | conversation_is_visible | unread | 
+---------+-----------------+-------------------------+--------+ 
|  1 |    1 |      1 |  0 | 
|  1 |    2 |      1 |  0 | 
|  2 |    1 |      1 |  1 | 
|  2 |    2 |      1 |  0 | 
|  3 |    2 |      1 |  0 | 
+---------+-----------------+-------------------------+--------+ 

查詢應針對用戶1和用戶2之間的通話搜索時只有交談1示出了,作爲會話2具有用戶3在它藏漢。

我試過下面的查詢,但顯示了雙方的對話,所以不知道如何將它限制爲只包含這些用戶的對話......

SELECT * FROM conversation 
LEFT JOIN conversation_user ON conversation.id = conversation_user.conversation_id 
WHERE user_id IN (1,2); 

我可以在休眠使用此查詢和然後檢查組談話用戶在對話,以確保對話只包含2級中給出的用戶,但不知道是否有一個更有效的方法

+1

一些示例數據和預期的輸出示例將是巨大的。 – Utsav

+0

到目前爲止你的最大努力 – Strawberry

+0

@Utsav已更新的問題,謝謝:) – beerye

回答

1

試試這個

http://sqlfiddle.com/#!9/587e4/5

SELECT t1.user_id, 
     t1.conversation_id, 
     t1.conversation_is_visible, 
     t1.unread 
FROM conversation_user t1 
LEFT OUTER JOIN 
(SELECT user_id,conversation_id 
    FROM conversation_user WHERE user_id IN (1,2) 
) t2 ON t1.user_id=t2.user_id 
AND t1.conversation_id=t2.conversation_id 
WHERE t2.conversation_id IS NOT NULL; 

如果你只是想conversation_id然後在select子句中使用distinct t1.conversation_id

+0

感謝您的答案,這個查詢仍然會返回兩個對話,但是..我發佈了一個基於你的答案,讓我得到正確的結果 – beerye

0

根據Utsav的回答,以下查詢得到了我以後的結果。

SELECT t1.user_id, t1.conversation_id, t1.conversation_is_visible, t1.unread 
FROM conversation_user t1 
LEFT OUTER JOIN 
    (SELECT * 
    FROM conversation_user 
    GROUP BY conversation_id HAVING COUNT(*) = 2 
    ) t2 
ON t1.user_id = t2.user_id AND t1.conversation_id=t2.conversation_id 
WHERE t1.user_id IN (1,2) AND t2.conversation_id IS NOT NULL; 

仍然不知道如何將其轉換爲一個查詢在休眠但其開始