0

我有一个只生成项目 ID 的表。project_table,其中有 theproject_id和其他列。

我有另一个表project_members,它有 2 列project_id,即FOREIGN KEYtoproject_table和一user_id列。

我想知道一组用户(作为逗号分隔值传递)是否属于同一个project_id.

例如 - 该project_members表具有以下条目

project_id user_id
         1       1
         1       2
         2       3
         2       4
         2       1

当我通过时id's 1,2,我想知道project_id这些用户进来了。条件是只ids 1 and 2应该在那个项目中。

所以上述数据的输入和输出应该是——

input output
1,2        1
1,2,3   NONE
1,3,4      2
1,2,4   NONE.

这怎么可能?

4

1 回答 1

3
SELECT   project_id
FROM     project_members
WHERE    user_id IN (1,3,4)
GROUP BY project_id
HAVING   COUNT(*) = 3

sqlfiddle上查看。

请注意,这假设(project_id, user_id). project_members如果有重复,您将需要使用更昂贵COUNT(DISTINCT user_id)的而不是COUNT(*).


如果您必须在存储过程中执行此操作,您可以使用 MySQL 的FIND_IN_SET()函数代替IN运算符,并从总数CHAR_LENGTH()减去输入字符串的长度(删除所有逗号)计算计数:

CREATE PROCEDURE get_projects(IN members TEXT)
SELECT   project_id
FROM     project_members
WHERE    FIND_IN_SET(user_id, members)
GROUP BY project_id
HAVING   COUNT(*) = 1 + CHAR_LENGTH(members)-CHAR_LENGTH(REPLACE(members,',',''));

请注意,这假定members包含用逗号分隔的不同值,并且没有其他填充或多余内容。 user_id


要查找包含指定确切成员的项目,可以改为:

SELECT   project_id
FROM     project_members
GROUP BY project_id
HAVING   COUNT(*) = 3
     AND NOT SUM(user_id NOT IN (1,3,4))

程序版本将是:

CREATE PROCEDURE get_projects(IN members TEXT)
SELECT   project_id
FROM     project_members
GROUP BY project_id
HAVING   COUNT(*) = 1 + CHAR_LENGTH(members)-CHAR_LENGTH(REPLACE(members,',',''))
     AND NOT SUM(FIND_IN_SET(user_id, members)=0);
于 2012-08-31T16:38:09.700 回答