我想从下面的表中获取数据,这样我就不必调用多个查询并设置response isLikedByUser的属性。userId我正在发送请求。
发布--表名
userId、postId、text、likesCount、commentsCount
LikeMapping --表名
userId,postid
现在,我编写了基于userId的查询并从第一个表中获取数据。然后对每一行进行迭代,对于来自请求的每个postId和userId,在表2中找到行,如果找到数据,则设置isLikedByUser属性。
如何编写查询来帮助我填充属性值,而不是在循环中编写查询。
谢谢
为了澄清更多,isLikedByUser只是响应属性,在任何表中都没有列,如果在第二个表中找到映射,则希望将其设置为true或false。
发布于 2019-03-12 01:51:46
您需要使用LEFT OUTER JOIN
和CASE
语句。像下面这样的东西应该可以工作。
Select p.*,
case count(lm.postid) when 0 then true else false end as isLikedByUser
from Posts p
LEFT OUTER JOIN LikeMapping lm ON p.postId = lm.postId
WHERE lm.userId = userIdFromRequest
group by userId, postId, text, likesCount, commentsCount;
发布于 2019-03-12 02:04:08
如果用户对给定用户的每个帖子都喜欢自己的帖子,则在子查询上使用左连接和COALESCE来获得true/false (1/0)标志
SELECT p.*, COALESCE(isLikedByUSer, 0)
FROM Posts p
LEFT JOIN (SELECT 1 isLikedByUser, postId, userID FROM LikeMapping) as l ON l.postId = p.postId AND l.userId = p.userId
WHERE p.userId = 100
发布于 2019-03-13 08:08:55
这可能比其他答案更快。
SELECT p.*,
lm.postid IS NOT NULL AS isLikedByUser
FROM Posts AS p
LEFT JOIN ( SELECT DISTINCT postid FROM LikeMapping ) AS lm
ON lm.postid = p.postid
什么版本的MySQL?这可能需要5.6或更高版本。
如果您想进一步讨论,请提供EXPLAIN SELECT ...
。
https://stackoverflow.com/questions/55106681
复制相似问题