0

我需要一些帮助我查询的优化SQL JOIN平均值

我有两个表

表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将所有用户计算平均得分,然后加入只是我所需要的,这不是最优化。

回答

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

+0

谢谢你,你的决定非常好 – AlexCarlayl

0

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 
0

基于从里克的反馈,下面是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] 
+0

MySQL中没有[]括号。 –

+0

@RickJames,谢谢你的信息。通过标签,我不确定OP是否正在寻找适用于MySQL和SQL Server的解决方案,或者其中之一。我只是编辑了我的答案,以指定我的答案是针对SQL Server的。 – Tim