【问题标题】:MySQL inner joins?MySQL内部连接?
【发布时间】:2012-03-07 11:51:40
【问题描述】:

我有一个用于调查的数据库设计。

我有一个带有 user_id PK 和名称的表 USERS。

带有 question_id 和 question_text 的QUESTION。

POSSIBLE_ANSWER with answer_id PK ,value, text.

另外,我有来自 users 、 Question_id 、 answer_id 的 USER_ANSWERS 和 user_id 。

还有一些与我的问题无关的其他表格。

我需要为所有名称为“m%”的用户选择 avg(value)。

希望这很清楚,谢谢。

【问题讨论】:

    标签: mysql inner-join


    【解决方案1】:

    尝试以下方法:

    select avg(PA.value)
    from POSSIBLE_ANSWER PA
    inner join USER_ANSWERS UA on PA.answer_id = UA.answer_id
    inner join USERS U on U.user_id = UA.user_id 
    where U.name like 'm%'
    

    【讨论】:

    • @Crontab:根据数据库,它可能不一定是真的。如果没有指定 GROUP BY,至少 MySQL 会在结果集中创建一个包含所有行的隐式组
    • @PatrikAkerstrand:是的,我假设提问者想要您在回答中提到的每个用户的平均值。
    • @Crontab 并不是每次聚合函数都需要 group by,如果我们在 select 列表中有多个带有聚合函数的列,那么 group by 是必要的,在这种情况下我们不需要它。跨度>
    • 问题是获取所有名称以'm'开头的用户的平均值
    • @Vikram:“对所有名称以'm'开头的用户的平均”语句可以有多种解释。
    【解决方案2】:
    SELECT u.user_id, u.name, AVG(pa.value) 
    FROM USER_ANSWERS ua 
    INNER JOIN POSSIBLE_ANSWER pa ON pa.answer_id = ua.answer_id
    INNER JOIN USERS u ON ua.user_id = u.user_id
    WHERE u.name LIKE 'm%'
    GROUP BY u.user_id
    

    如果您想要名称以“m”开头的所有用户的平均值,请删除 GROUP BY。该查询给出了名称以 m 开头的平均 PER 用户。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      SELECT u.name, AVG(pa.value) AS avgvalue
      FROM USER_ANSWERS ua
      INNER JOIN USERS u ON u.user_id = ua.user_id
      INNER JOIN POSSIBLE_ANSWER pa ON pa.answer_id = ua.answer_id
      WHERE u.name LIKE 'm%'
      GROUP BY u.name
      

      尽管我仍然有兴趣阅读您迄今为止所尝试的内容。您可以将 u.user_id 添加到您的选择列表并按此分组(就像 PatrikAkerstrand 所做的那样) - 如果您的名字不是唯一的,您必须这样做

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-07
        • 2017-06-24
        • 2014-01-24
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多