【问题标题】:Fetching data in one query from mapping table从映射表中获取一次查询中的数据
【发布时间】:2019-08-02 01:14:41
【问题描述】:

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

帖子 -- 表名
用户身份, 邮政编码, 文本, 喜欢计数, cmetsCount

LikeMapping -- 表名
用户身份, 邮编

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

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

谢谢

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

【问题讨论】:

  • 我可能弄错了,但听起来你可以执行 INNER JOIN。 Select * from Posts p INNER JOIN LikeMapping lm ON p.postId = lm.postId WHERE lm.userId = userIdFromRequest w3schools.com/sql/sql_join_inner.asp
  • 你能分享一些示例数据和你想要达到的结果吗?
  • 不,Derek,加入我所要求的并不简单。如果映射表中可用,我想根据数据设置响应属性值之一。 (第二)。我通过迭代从第一个表中找到的数据来实现它,但我想在一个查询中完成。
  • 例如。我用 userId 100 调用了 RestAPI,并在 Posts 表中查询了用户 100 给出的帖子。帖子 1、100、xxx、yyy、zzz 2、102、aaa、bbb、ccc 3、101、sss、fff、ggg 4、 100, uuu, nnn, mmm 第一个查询只有两行,因为用户只做了两个帖子 (1,4) LikeMapping 1,105 2,103 3,106 4,100 如果映射表中有数据,现在对于用户完成的每个 postId (1,4) postId=1 和 userId =100 设置响应属性 isLikedByUser = true。那就是我想弄清楚用户是否喜欢他自己的帖子,因为帖子喜欢保存在映射表中。
  • 如果您认为您刚刚输入的信息与您的问题相关,那么edit 问题而不是将其发布为 cmets

标签: java mysql sql performance optimization


【解决方案1】:

在子查询上使用 LEFT JOIN 和 COALESCE 来获取真/假 (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

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      【解决方案3】:

      这可能比其他答案更快。

      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 ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-12
        • 2015-09-06
        • 2019-10-14
        • 2023-03-29
        • 2019-02-27
        • 2022-09-23
        • 2019-07-03
        • 1970-01-01
        相关资源
        最近更新 更多