check包含逗号分隔列表中的项目作为sql server中的查询结果

时间:2018-04-16 06:25:58

标签: sql sql-server

我在SQL Server中有一个Post表,出于性能原因,该表有一个以逗号分隔值形式的列(UsersWhoLiked),用于指定喜欢Post的UserIds如下所示。

Id | Subject |  UsersWhoLiked
---|---------|-----------
1  | red     |  u1,u2
2  | blue    |  u2, u3,u4,u5
3  | green   |  
4  | gray    |  u3, u4, u7

我想编写一个查询,将UserId作为参数并返回Post of Post作为结果,以便在结果中,每个帖子都有一个列,指定用户喜欢或不喜欢帖子。

示例:对于UserId:u3

我希望:

Id | Subject |  Liked
---|---------|-----------
1  | red     |  0
2  | blue    |  1
3  | green   |  0
4  | gray    |  1

查询:

SELECT Id, Subject FROM Post

但我不知道如何将Liked列添加到Select语句

4 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

SELECT Id, Subject, 
    IIF(CHARINDEX('u3,', REPLACE(CONCAT(UsersWhoLiked, ','), ' ', '')) > 0, 1, 0) AS Liked 
FROM Post
  

演示: http://sqlfiddle.com/#!18/3a588/1/0

您应该使用第二个表来存储喜欢的内容:

CREATE TABLE PostLikes (
    PostId INT FOREIGN KEY REFERENCES Post(Id),
    UserId INT FOREIGN KEY REFERENCES Users(Id),
    CONSTRAINT PK_PostLikes PRIMARY KEY (PostId, UserId)
);

因此,您可以使用以下SELECT来获取预期信息:

SELECT Id, Subject, IIF(ISNULL(PostLikes.UserId, 0) > 0, 1, 0) AS Liked
FROM Post LEFT JOIN PostLikes ON Post.Id = PostLikes.PostId AND PostLikes.UserId = 3
  

演示: http://sqlfiddle.com/#!18/176ce/4/0

答案 1 :(得分:1)

您可以尝试以下方法:

 Route::get('/cart/payment', 'CartController@getcartpayment')->middleware('checkAuth');


 $user = Sentinel::findById($user_id);
        $role= $user->role();

答案 2 :(得分:1)

我不知道如何存储逗号分隔值可以提高性能,但这不是一个好主意。在你的情况下,你应该小心子串。例如,如果您要查找u3,则不应与u31匹配。因此,在,

中的每个值之前和之后放置UsersWhoLiked
declare @userId varchar(10) = 'u3'
select 
    Id, Subject
    , Liked = isnull(sign(charindex(',' + @userId + ',', ',' + UsersWhoLiked + ',')), 0)
from Post

答案 3 :(得分:1)

select *, case PATINDEX('%u3%', userwholikes) --dont use u3(comma), only use u3
when 0 then                                   --because u3 becomes last one
0
else 1
end likes
from yourtable

我根据我的理解给出了这个......