MySQL多表查询,每行平均值

Ale*_*lex 2 mysql

这是我的设置:

  • 表“文件”:id (PK)、文件名、user_id、日期、文件大小
  • 表“scores”:id(PK)、file_id、user_id、score

表“文件”包含一个包含详细信息的文件列表;表“分数”跟踪每个文件的 1-5 分。我需要从“文件”表中获取条目,并且在每一行中我都需要该文件的所有信息以及平均分数。当我遍历行时​​,我可以对当前的 file_id 进行另一个查询,但显然这不是很优化。我尝试了类似下面的方法,但没有成功。

SELECT files.*, (SUM(scores.score)/(COUNT(scores.score))) AS total FROM files INNER JOIN scores ON files.id=scores.file_id;

请指出我正确的方向 - 谢谢!

Dan*_*llo 5

您可能想尝试以下操作:

SELECT f.id, f.filename, f.user_id, f.date, f.filesize,
       (
           SELECT AVG(s.score)
           FROM   scores s
           WHERE  s.file_id = f.id
       ) average_score
FROM   files f;
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用AVG()聚合函数。有没有必要来划分SUM()COUNT()

测试用例:

CREATE TABLE files (id int, filename varchar(10));
CREATE TABLE scores (id int, file_id int, score int);

INSERT INTO files VALUES (1, 'f1.txt');
INSERT INTO files VALUES (2, 'f2.txt');
INSERT INTO files VALUES (3, 'f3.txt');
INSERT INTO files VALUES (4, 'f4.txt');

INSERT INTO scores VALUES (1, 1, 10);
INSERT INTO scores VALUES (2, 1, 15);
INSERT INTO scores VALUES (3, 1, 20);
INSERT INTO scores VALUES (4, 2, 5);
INSERT INTO scores VALUES (5, 2, 10);
INSERT INTO scores VALUES (6, 3, 20);
INSERT INTO scores VALUES (7, 3, 15);
INSERT INTO scores VALUES (8, 3, 15);
INSERT INTO scores VALUES (9, 4, 12);
Run Code Online (Sandbox Code Playgroud)

结果:

SELECT f.id, f.filename, 
       (
           SELECT AVG(s.score)
           FROM   scores s
           WHERE  s.file_id = f.id
       ) average_score
FROM   files f;

+------+----------+---------------+
| id   | filename | average_score |
+------+----------+---------------+
|    1 | f1.txt   |       15.0000 |
|    2 | f2.txt   |        7.5000 |
|    3 | f3.txt   |       16.6667 |
|    4 | f4.txt   |       12.0000 |
+------+----------+---------------+
4 rows in set (0.06 sec)
Run Code Online (Sandbox Code Playgroud)

请注意,@Ignacio 的解决方案产生相同的结果,因此是另一种选择。