表结构为: Users 
---------------------------- 
id    first_name  last_name 
1      nacy          luo 
2      xu            yy Users_Tags 
----------------------------- 
user_id  tag_id 
1          1 
1          2 
1          5 
2          2 
2          5 
2          7 
Users_Tags (user_id) 为 指向 Users (id) 的外键。 当给定参数 tag_Ids = array(1,2,5) 时 用户 1  被选中。 
当给定参数 tag_Ids = array(2,5)  时 用户  1,2  被选中。 
当给定参数 tag_Ids = array(2,5,7) 时 用户 2  被选中。 
当给定参数 tag_Ids = array(1,2,5,7) 时 没有用户被选中。 
。 有一个问题补充一下, 
1、user表,users_tags表的数据是有很多的。我只是例出了几条数据例子。 
2、tag_Ids 中id的个数也是不确定的。还有可能多达100个,如tag_Ids = array('4','8','7'...'234','137'). 
请教各位高手,这句SQL如何写?在线等! 

解决方案 »

  1.   

    --方法1
    select user_id
    from Users_Tags t
    where (select count(1) from Users_Tags where user_id=t.user_id)>1
    and tag_id in(...)  --给定参数--方法2
    select user_id,count(tag_id)
    from Users_Tags
    group by user_id
    where tag_id in(...) --给定参数
    having count(tag_id)>1
      

  2.   

    楼上的方法测试结果: 
    如果 tag_Ids = array(1,2,5,7)
    用户1,2 都将被选出来,这样是不对的。
      

  3.   

    select tag_id,count(distinct user_id) as cnt
    from Users_Tags
    group by tag_id
    where tag_id in(...) --给定参数
    having count(distinct user_id)>1
    再试试这个
      

  4.   

    这个也不行,我想用tag_id in(...) 这种方式是行不能的。因为tag_Ids中的每一个id 都要同时在users_tags中找到属于同一个用户的记录,这个用户才成功匹配。
      

  5.   

    当给定参数 tag_Ids = array(1,2,5) 时 用户 1  被选中。 
    当给定参数 tag_Ids = array(2,5)  时 用户  1,2  被选中。 
    当给定参数 tag_Ids = array(2,5,7) 时 用户 2  被选中。 
    当给定参数 tag_Ids = array(1,2,5,7) 时 没有用户被选中。仔细看了一下,这个规则好像没什么规律的?
      

  6.   

    -- 设成测试数据
    CREATE TABLE #Users(id INT,    first_name  VARCHAR(5), last_name VARCHAR(5)) 
    INSERT #Users SELECT 1 ,     'nacy',          'luo' 
    INSERT #Users SELECT 2,      'xu'    ,        'yy' CREATE TABLE #Users_Tags ([user_id] INT,  tag_id INT) 
    INSERT #Users_Tags SELECT 1  ,        1 
    INSERT #Users_Tags SELECT 1  ,        2 
    INSERT #Users_Tags SELECT 1  ,        5 
    INSERT #Users_Tags SELECT 2  ,        2 
    INSERT #Users_Tags SELECT 2 ,         5 
    INSERT #Users_Tags SELECT 2,          7 -- 创建存储过程
    CREATE PROC FIND_USERS
        @LIST VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @INDEX INT
        SET @INDEX = CHARINDEX(',',@LIST)    -- 1.参数放到临时表@T_LIST里
        DECLARE @T_LIST TABLE (ID INT)
        WHILE(@INDEX <> 0)
        BEGIN    
            INSERT INTO @T_LIST SELECT LEFT(@LIST,@INDEX-1)
            SET @LIST = SUBSTRING(@LIST,@INDEX+1,LEN(@LIST)-@INDEX)
            SET @INDEX = CHARINDEX(',',@LIST)
        END
        INSERT INTO @T_LIST SELECT @LIST
        -- 2. FIND USERS
        SELECT * FROM #Users
        WHERE ID IN (
            SELECT DISTINCT [USER_ID] 
            FROM (SELECT DISTINCT [USER_ID],TAG_ID FROM #Users_Tags) T
                INNER JOIN (SELECT DISTINCT ID FROM @T_LIST) L
                ON T.TAG_ID = L.ID
            GROUP BY [USER_ID]
            HAVING COUNT(*)=(SELECT COUNT(DISTINCT ID) FROM @T_LIST))
    END
    -- 测试
    EXEC FIND_USERS '1,2,5'
    EXEC FIND_USERS '2,5'
    EXEC FIND_USERS '2,5,7'
    EXEC FIND_USERS '1,2,5,7'/*-- 结果
    --1.EXEC FIND_USERS '1,2,5'
    ================================
    id          first_name last_name
    ----------- ---------- ---------
    1           nacy       luo--2.EXEC FIND_USERS '2,5'
    ================================
    id          first_name last_name
    ----------- ---------- ---------
    1           nacy       luo
    2           xu         yy--3.EXEC FIND_USERS '2,5,7'
    ================================
    id          first_name last_name
    ----------- ---------- ---------
    2           xu         yy--4.EXEC FIND_USERS '1,2,5,7'
    ================================
    id          first_name last_name
    ----------- ---------- ---------
    */