首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从映射表中获取一个查询中的数据

从映射表中获取一个查询中的数据
EN

Stack Overflow用户
提问于 2019-03-12 00:49:57
回答 3查看 376关注 0票数 1

我想从下面的表中获取数据,这样我就不必调用多个查询并设置response isLikedByUser的属性。userId我正在发送请求。

发布--表名

userId、postId、text、likesCount、commentsCount

LikeMapping --表名

userId,postid

现在,我编写了基于userId的查询并从第一个表中获取数据。然后对每一行进行迭代,对于来自请求的每个postId和userId,在表2中找到行,如果找到数据,则设置isLikedByUser属性。

如何编写查询来帮助我填充属性值,而不是在循环中编写查询。

谢谢

为了澄清更多,isLikedByUser只是响应属性,在任何表中都没有列,如果在第二个表中找到映射,则希望将其设置为true或false。

EN

回答 3

Stack Overflow用户

发布于 2019-03-12 01:51:46

您需要使用LEFT OUTER JOINCASE语句。像下面这样的东西应该可以工作。

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2019-03-12 02:04:08

如果用户对给定用户的每个帖子都喜欢自己的帖子,则在子查询上使用左连接和COALESCE来获得true/false (1/0)标志

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-03-13 08:08:55

这可能比其他答案更快。

代码语言:javascript
复制
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 ...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55106681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档