2012-08-31 24 views
0

我有一个只生成Project ID的表。 project_table,其中有project_id和其他列。获取组中的条目列表。 MySQL

我有另一个表project_members其具有2列project_id它是FOREIGN KEYproject_tableuser_id柱。

我想知道一组用户(作为逗号分隔值传递)是否落在相同的project_id中。

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

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

当我通过id's1,2我想知道哪些project_id这些用户都在同时的条件是,只有ids 1 and 2应在该项目中。 。

因此,对于上述数据的输入和输出应该是 -

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

这怎么可能?

回答

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

请参阅sqlfiddle

请注意,这里假设在project_members中没有重复的(project_id, user_id)记录。如果有重复项,则需要使用更昂贵的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); 
+0

的问题是1,我将MySQL作为csv传递给MySQL,出于某种原因不理解的变量。 2.我如何获得计数。 – JHS

+0

@Juniad:这两个问题都可以在调度查询的应用程序代码中最容易解决。您的应用程序开发了哪种语言? – eggyal

+0

我将csv的id传递给存储过程。该应用程序在Java中。 – JHS