簡體   English   中英

SQL JOIN平均值

[英]SQL JOIN average value

我需要一些幫助來優化查詢

我有兩張桌子

表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您可以嘗試以下操作:

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

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

根據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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM