我在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语句
答案 0 :(得分:2)
您可以使用以下内容:
SELECT Id, Subject,
IIF(CHARINDEX('u3,', REPLACE(CONCAT(UsersWhoLiked, ','), ' ', '')) > 0, 1, 0) AS Liked
FROM Post
您应该使用第二个表来存储喜欢的内容:
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
答案 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
我根据我的理解给出了这个......