检查一个用户数组是否匹配作为具有匹配列

时间:2016-02-29 11:09:26

标签: mysql sql join group-by

我有一个具有以下结构的Channels表:

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,我不应该创建新的频道,而应该根据提供的测试数据传回channelID为1。但如果我要通过36,260和1657,我需要在频道中创建一个新条目'表,因为一个频道中不存在所有3个用户的当前实例。

所以我想知道检查用户是否已经存在于通道中的最佳方法是什么?

我想我可能必须在userChannels表中使用group by并构建动态查询?但我真的不确定如何实现这一点。

到目前为止我只有:

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

这是返回独特的渠道。我想我需要动态构建这个查询以继续添加userid =?取决于Web服务中传递的用户数组的长度。但我无法从这里看到哪里。任何帮助表示赞赏。

1 个答案:

答案 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的数量,则表示所有用户都被添加到同一频道。