2017-06-19 29 views
-1

我想從一個表像這樣選擇的數據(表名是conversations_users):如何加入具有特定條件的表

Table content sample

我想能夠檢索會話ID只包括兩個用戶。作爲實例,如果我搜索特定用戶1和3的對話會話數6應該是唯一的結果,這是因爲會話5還包括用戶2

我試圖執行像

SELECT * FROM conversations_users AS table1, 
       conversations_users AS table2 
     WHERE table1.conversation_ID = table2.conversationID AND 
       table1.userID = 3 AND 
       table2.userID = 1 
的請求

但它返回對話5和6.我該如何解決?

預先感謝您

回答

2

添加ON條款:

SELECT * FROM conversations_users AS table1 JOIN 
       conversations_users AS table2 
       ON table1.conversation_ID = table2.conversation_ID 
     WHERE table1.userID = 3 AND 
       table2.userID = 1 

更新: 要獲得唯一coversations,其中只有1和3都參與其中,您可以使用having子句:

SELECT table1.conversation_ID FROM conversations_users AS table1 JOIN 
       conversations_users AS table2 
       ON table1.conversation_ID = table2.conversation_ID 
     WHERE table1.userID = 3 AND 
       table2.userID = 1 
     Group by table1.conversation_ID 
     having Count(*) = 2 
+0

它仍然返回我的談話5和6 ..我怎麼能避免呢? –

+0

@axiac但它不是我回答的問題。 OP稍後改變了它 – Jens

+0

@PierreHUBERT不要使用舊式的實現連接語法。使用更新的爆炸風格 – Jens

0

您需要的查詢看起來像這樣:

SELECT conversation_ID, GROUP_CONCAT(DISTINCT userID ORDER BY userID) as users 
FROM conversations_users 
GROUP BY conversation_ID 
HAVING users = '1,3' 

GROUP BY子句基團具有相同conversation_ID並從每個組它生成包含conversation_IDuserID的不同的值,按升序排列的新記錄,與逗號(,)串接的行。

HAVING子句只保留由GROUP BY子句計算的列users中有'1,3'的那些記錄。

該查詢會生成您需要的輸出,但效率不高,因爲它會讀取整個表。通過先挑選用戶13的對話,然後僅將上述內容應用於他們,可能會更高效。

它看起來像這樣:

SELECT conversation_ID, GROUP_CONCAT(DISTINCT userID ORDER BY userID) as users 
FROM (
    SELECT * 
    FROM conversations_users 
    WHERE userID in (1, 3) 
) conversations 
GROUP BY conversation_ID 
HAVING users = '1,3' 

爲了工作比以前的查詢速度越快,conversations_users必須對userID列的索引。

0

如果你想限制那些正好涉及n個用戶的對話。我認爲以下通用查詢應該工作。按照要求替換'n'。

select * 
from conversations_users 
where conversation_id IN (select conversation_id 
         from conversations_users 
         group by conversation_id 
         having count(userid) = 2) 

謝謝, 阿米特巴巴

0

內選擇抓鬥與其他用戶大於1或3

外部選擇(具有不同)收集所有對話至極所有conversationIDs不在該子集中

SELECT DISTINCT conversationID 
    FROM conversations_users t1 
WHERE conversationID NOT IN (SELECT conversationID 
           FROM conversations_users 
           WHERE userID NOT in (1, 3) 
          ) 
0

在這種情況下,您可以使用加入條件。

SELECT #, userid ,conversation_ID FROM user AS table1 JOIN 
       conversations_users AS table2 
       ON user_ID = conversation_ID 
     WHERE table1.userID = 3 AND 
       table2.userID = 1 
     Group by conversation_ID 

您可以應用合適的條件where子句,而不是GROUP BY