2016-02-29 20 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