所以,我有一个包含用户和活动的表
users
id | activities
1 | "-2-3-4-"
2 | "-3-4-"
3 | "-1-2-3-4-"
activities
id | title
1 | running
2 | walking
3 | climbing
4 | singing
我正在尝试使用ID为3的用户来查找至少有两个相同活动的用户 我试图做的是这个
SELECT u.id FROM users u
WHERE ( SELECT COUNT(a.id) FROM activities a
WHERE a.id IN(TRIM( ',' FROM REPLACE( u.activities, '-', ',' ) ))
AND a.id IN(1,2,3) ) >= 2
任何想法?
答案 0 :(得分:1)
为了爱上帝,制作一个包含user_id和activity_id的第3个表。
这不是任何合适的解决方案。
您应该有一个表,用于在用户和活动之间建立连接,而不是将所有活动存储在用户表中的行中。
答案 1 :(得分:0)
您可以先创建一个带有user.activities字符串的函数,并在活动int ID中拆分字符串,如下所示:
create FUNCTION dbo.SplitStringToIds (@acts nvarchar(MAX))
RETURNS @acivityids TABLE (Id int)
AS
BEGIN
DECLARE @stringToInsert nvarchar (max)
set @stringToInsert=''
DECLARE @intToInsert int
set @intToInsert=0
DECLARE @stidx int
set @stidx=0
DECLARE @endidx int
set @endidx=0
WHILE LEN(@acts) > 3
BEGIN
set @stidx=CHARINDEX('-', @acts, 1)
set @acts=substring(@acts,@stidx+1,len(@acts))
set @endidx=CHARINDEX('-', @acts, 1)-1
set @stringToInsert=substring(@acts,1,@endidx)
set @intToInsert=cast(@stringToInsert as int)
INSERT INTO @acivityids
VALUES
(
@intToInsert
)
END
-- Return the result of the function
RETURN
END GO
然后您可以尝试使用这样的内容来获取具有2个或更多相同活动的用户,其中id = 3的用户
select u.id,count(u.id) as ActivitiesCounter from users as u
cross apply SplitStringToIds(u.activities) as v
where v.id in (select v.id from users as u
cross apply SplitStringToIds(u.activities) as v
where u.id=3)
group by u.id having count(u.id)>=2
但我认为这种存储表之间关系的方式只会给你带来麻烦,如果可以,最好添加一个关系表。