2016-02-29 38 views
0

我有一個頻道表結構如下:檢查,如果用戶的數組匹配的條目存在於連接表的匹配列

CREATE TABLE IF NOT EXISTS `channels` (
`ID` int(20) NOT NULL, 
    `Name` varchar(50) NOT NULL, 
    `creatorID` int(11) NOT NULL, 
    `dateCreated` int(20) NOT NULL, 
    `isRead` tinyint(4) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 


INSERT INTO `channels` (`ID`, `Name`, `creatorID`, `dateCreated`, `isRead`) VALUES 
(1, 'chat', 260, 1456307705, 1), 
(2, 'chat2', 36, 1456326568, 0), 
(3, 'chat3', 260, 1456737864, 1); 

然後我有一個userChannels表,列出了所有的成員誰已被邀請進入每個頻道。這是格式如下:

CREATE TABLE IF NOT EXISTS `userchannels` (
`ID` int(11) NOT NULL, 
    `userID` int(11) NOT NULL, 
    `channelID` int(11) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; 

INSERT INTO `userchannels` (`ID`, `userID`, `channelID`) VALUES 
(1, 36, 1), 
(2, 260, 1), 
(3, 36, 2), 
(4, 1657, 2), 
(5, 1657, 3), 
(6, 260, 3); 

我創建一個Web服務來檢查,如果用戶錯過了在Web服務是這一渠道成員在先前的頻道已經存在。因此,如果它們已經存在,我將傳回現有的ChannelID,如果不存在,我將創建一個新頻道並添加條目。

所以如果我要傳遞36和260的用戶ID,我不應該創建一個新的頻道,而應該根據提供的測試數據返回1的channelID。但是如果我要傳遞36,260和1657,我需要在頻道表中創建一個新條目,因爲在一個頻道中不存在所有3個用戶的當前實例。

所以我想知道檢查用戶傳遞的最佳方式是否已經存在於通道中?

我想我可能不得不利用groupCode在userChannels表中並構建一個動態查詢?但我真的不知道如何實現這一點。

到目前爲止,所有我擁有的是:

SELECT * FROM `userchannels` 
WHERE userID = ? or userid = ? group by channelID 

這是返回唯一通道。我想我需要動態構建這個查詢來繼續添加userid =?取決於在Web服務中傳遞的用戶數組的長度。但我看不到從這裏走到哪裏。任何幫助讚賞。

+0

'userID IN('? – artm

+0

)所有的用戶應該在同一個頻道還是沒有? –

回答

1
SELECT * FROM `userchannels` 
WHERE userID in (user ids comma ceparated) group by channelID 
HAVING count(userId)=<amount of user ids> 

您可以使用IN列出所有用戶ID。如果對於頻道COUNT =用戶ID數量,則意味着所有用戶都被添加到同一頻道。

+0

這似乎正是我所需要的。我現在唯一的問題是當它正在掃描的查詢上運行解釋整個表有沒有什麼辦法可以優化這個呢我知道使用'in'會有些棘手我目前在這張表上沒有索引 – user2363025

+0

爲userchannels表定義一個主鍵它會自動添加index和IN將工作基於索引 – StanislavL

+0

對不起,我有一個主鍵定義。我的意思是我沒有任何額外的索引,主要是ID和自動遞增。但仍然掃描整個表,但每個解釋 – user2363025