【问题标题】:SQL JOIN average valueSQL JOIN 平均值
【发布时间】:2015-05-04 16:49:17
【问题描述】:

我需要一些帮助来优化我的查询

我有两张桌子

表 1 - users_location; 表 2 - users_rating

+-------+---------+      +-------+--------+
|user   | location|      | user  | rating | 
+-------+---------+      +-------+--------+
| user1 |   AA    |      | user1 |   1    |
| user2 |   BB    |      | user1 |   3    |
| user3 |   CC    |      | user1 |   4    |
| user4 |   AA    |      | user2 |   3    |
| user5 |   BB    |      | user4 |   2    |
| user6 |   CC    |      | user4 |   4    |

我需要按位置选择用户及其平均评分(例如 AA)。 现在我的查询是:

SELECT * 
FROM users_loaction AS TABLE1
LEFT JOIN (
    SELECT  
        user, 
        AVG(rating) 
    FROM users_rating group by user
) AS TABLE2 
ON  TABLE1.user = TABLE2.user
WHERE TABLE1.location = AA

我认为 SQL 会计算所有用户的平均评分,然后只加入我需要的,这不是优化的。

【问题讨论】:

    标签: mysql sql-server performance optimization query-optimization


    【解决方案1】:

    mysql 你可以试试这个:

    SELECT *, 
        (SELECT AVG(rating) FROM users_rating AS ur WHERE ur.user = ul.user ) AS rating
    FROM users_location AS ul
    WHERE ul.location = 'AA';
    

    这里是sqlfiddle

    【讨论】:

      【解决方案2】:

      http://sqlfiddle.com/#!9/c34c8d/1

      SELECT t.*, AVG(t2.rating) 
      FROM users_location t
      LEFT JOIN  users_rating t2
      ON  t.user = t2.user 
      WHERE t.location = 'AA'
      GROUP BY t.Location;
      
      SELECT t.*, AVG(t2.rating) 
      FROM users_location t
      LEFT JOIN  users_rating t2
      ON  t.user = t2.user 
      WHERE t.location = 'AA'
      GROUP BY t.user;
      
      SELECT t.*, AVG(t2.rating) 
      FROM users_location t
      LEFT JOIN  users_rating t2
      ON  t.user = t2.user 
      WHERE t.location = 'AA'
      GROUP BY t.Location, t.user
      

      【讨论】:

        【解决方案3】:

        根据 Rick 的反馈,以下是 MySQL 和 SQL Server 的答案:

        MySQL

        http://sqlfiddle.com/#!9/9e9be8/1

        SELECT l.user, AVG(r.rating) FROM users_location l
            LEFT JOIN users_rating r ON l.user = r.user
            WHERE l.location = 'AA'
            GROUP BY l.user
        

        SQL 服务器

        http://sqlfiddle.com/#!6/379e6/1

        SELECT l.[user], AVG(r.rating) FROM users_location l
            LEFT JOIN users_rating r ON l.[user] = r.[user]
            WHERE l.location = 'AA'
            GROUP BY l.[user]
        

        【讨论】:

        • MySQL 中没有 [] 括号。
        • @RickJames,感谢您提供的信息。通过标签,我不确定 OP 是否正在寻找适用于 MySQL 和 SQL Server 或两者之一的答案。我刚刚编辑了我的答案以指定我的答案适用于 SQL Server。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        相关资源
        最近更新 更多