表结构为: 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如何写?在线等!
----------------------------
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如何写?在线等!
解决方案 »
- mysql 两个数据表怎么生成这样的用户表
- mysql函数的编写的语法
- .frm .myd. .myi如何导入到My SQL数据库中
- PostgreSQL 中怎样生成 Sequence?
- MY SQL 中的 LIMT是什么作用 ??
- 问题急,求一条sql语句,实现这样的功能,高手们请进!有分贡上!。。。。。。。。。。。。。
- 请问各位大哥,怎样在新装的MYSQL里新建一个用户,很急,请各位帮忙,感谢你们~!~~!~~! :(
- mysql在win2003下的安装问题
- 数据库中的表建好后,怎样再定义主键,指令是什么,请各位江湖高手帮忙
- 寻求一个小巧的RDBMS,见内(100分)
- 急求ip对应地区的sql文件
- MYSQL 如何获取表主键
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
如果 tag_Ids = array(1,2,5,7)
用户1,2 都将被选出来,这样是不对的。
from Users_Tags
group by tag_id
where tag_id in(...) --给定参数
having count(distinct user_id)>1
再试试这个
当给定参数 tag_Ids = array(2,5) 时 用户 1,2 被选中。
当给定参数 tag_Ids = array(2,5,7) 时 用户 2 被选中。
当给定参数 tag_Ids = array(1,2,5,7) 时 没有用户被选中。仔细看了一下,这个规则好像没什么规律的?
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
----------- ---------- ---------
*/