【问题标题】:Mysql Nested SelectMysql嵌套选择
【发布时间】:2011-05-16 08:37:19
【问题描述】:

从这个问题开始 last_question 有这个表

`id`, `bbs_id`, `user_id`, `like_dislike`
(15,   4,        2,         0),
(14,   4,        1,         0),
(13,   3,        1,         0),
(12,   2,        1,         1),
(11,   1,        2,         0),
(10,   1,        1,         1);

如何查看单个用户喜欢或不喜欢的内容?假设我想要一个汇总表,其中包含所有喜欢和不喜欢的内容以及另一列用户 x 是否喜欢它。

这是我尝试过的查询

$user_id = 1;


SELECT bbs_id,
     (SELECT like_dislike FROM bb_ratings WHERE user_id={$user_id}) AS thisUsersRating,
       SUM(CASE WHEN like_dislike = 1 THEN 1 ELSE 0 END) AS likes, 
       SUM(CASE WHEN like_dislike = 0 THEN 1 ELSE 0 END) AS dislikes
FROM bb_ratings
GROUP BY bbs_id

我想我在这里遇到的问题是,您如何在此特定行中引用 user_id = x,而不是在所有行中。 提前致谢 安德鲁

【问题讨论】:

    标签: php mysql normalization


    【解决方案1】:

    我已经对上一个问题添加了一个答案,请先参考,以便理解。

    您无法单独从bb_ratings 获得它,方法是对它进行分组并破解它。您得到 Null 是因为您在考虑网格,而不是关系集(这是关系模型的核心概念)。

    1. 在您决定使用哪个表来为您的查询提供服务之前,您需要确定您想要的结果集结构。

    2. 然后用WHERE 子句约束它(哪些行)。

    3. 然后找出从哪里(哪些表)获取列。要么加入更多的表,要么在WHERE 子句上做更多的工作;或标量子查询,与外部查询相关。

    你不清楚你想要什么。看起来您想要与上一个问题相同的报告,以及给定用户投票的列。对我来说,你的结果集的结构是一个公告列表。好吧,我可以从 bulletin 得到那个,不需要去 bulletin_like 然后必须 GROUP 那个。

    如果您从集合的角度考虑,这很容易,无需通过物化视图或“嵌套”查询跳过箍:

    SELECT name AS bulletin, 
        (SELECT COUNT(like) 
            FROM  bulletin_like bl 
            WHERE bl.bulletin_id = b.bulletin_id 
            AND   like = 1
            ) AS like,
        (SELECT COUNT(like) 
            FROM  bulletin_like bl 
            WHERE bl.bulletin_id = b.bulletin_id 
            AND   like = 0
            ) AS dislike,
        (SELECT COUNT(like) 
            FROM  bulletin_like bl 
            WHERE bl.bulletin_id = b.bulletin_id 
            AND   bl.user_id = {$user_d}
            AND   like = 1
            ) AS your_vote
        FROM bulletin b

    评论回复

    我感觉你所说的对于我如何处理 SQL 非常重要

    1. 是的,当然。如果你愿意预先学习正确的东西,它会:

      • 以后各种问题都帮你解决
      • 让您的查询更高效
      • 让您编码更快
        .
    2. 现在,忘记将结果集用作表(慢得多)和临时表(如果您的数据库是规范化的,则绝对不需要)。直接查询表好多了。您需要学习各种科目,例如关系模型;如何使用 SQL;如何使用 SQL 以避免出现问题;等等。我愿意帮助你,和你在一起一段时间,但我需要知道你愿意。这将需要一些来回。这个网站有点吵,所以我会忽略其他的cmets(直到最后),只回复你的。

      • 停止使用GROUP BY,它严重阻碍了你对SQL的理解。如果不使用 GROUP BY 无法获得所需的报告,请提出问题。
        .
    3. 这个发布的问题。让我知道您是在什么时候迷路的,我会从那时起提供更多详细信息。

      • 对于这个问题,您需要一个公告列表,带有点赞;不喜欢;这个用户喜欢。那是对的吗 ?你试过我提供的代码吗?
        .
    4. 查看了链接的问题。这是一团糟,没有人解决更深层次的问题;他们在表面上孤立地回答了这个问题。你现在有了答案,但你不明白。这是一种非常缓慢的进步方式。

    【讨论】:

      【解决方案2】:

      $user_id = 1

      SELECT bbs_id,
             sum(CASE WHEN user_id = {$user_id} THEN like_dislike END) AS thisUsersRating,
             SUM(CASE WHEN like_dislike = 1 THEN 1 ELSE 0 END) AS likes, 
             SUM(CASE WHEN like_dislike = 0 THEN 1 ELSE 0 END) AS dislikes
      FROM bb_ratings
      GROUP BY bbs_id
      

      给我

      bbs_id     thisUsersRating  likes         dislikes
          (1,         '1',            '1',             '1'),
          (2,         '1',            '1',             '0'),
          (3,         '0',            '0',             '1'),
          (4,         '0',            '0',             '2');
      

      如果我将 user_id 更改为 4,那么所有 thisUsersRating 字段都会为空。

      【讨论】:

        猜你喜欢
        • 2019-01-06
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多