所以我完成了任务,有些人甚至在谷歌的帮助下仍未能解决.也许有人可以建议一些解决方案(是否必须使用JOINS?等等).
这是数据库:
CREATE TABLE Foto (
ID int PRIMARY KEY,
FileName varchar(100),
FileSize int,
Created int
) DEFAULT CHARSET=utf8;
CREATE TABLE Users (
LoginName varchar(10) PRIMARY KEY,
Surname varchar(20),
Name varchar(20),
Created date,
LastLoginDate date
) DEFAULT CHARSET=utf8;
CREATE TABLE Scoring (
ID int,
LoginName varchar(10),
Score int,
ScoreDate date,
FOREIGN KEY (LoginName) REFERENCES Users(LoginName),
FOREIGN KEY (ID) REFERENCES Foto(ID),
PRIMARY KEY(ID, LoginName)
) DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
"Foto"(照片)和"用户"表格应该非常清楚."评分"表适用于对照片进行评分的用户.每个用户只能为每张照片评分一次.任务是:
编写将返回AVG得分高于9的所有照片的照片ID,FileName和AVG(得分)的查询,并创建将提高此查询性能的索引.
写入将返回"LoginName","Name","Surname"的查询以及用户已为其为特定用户(例如,名称为"John"的用户)评级的照片提供的AVG分数.创建可以提高此查询性能的索引.
我正在使用MySQL 5.5.16,我对第一个查询的想法是这样的:
SELECT F.ID, F.FileName, AVG(SC.Score)
FROM Foto F, scoring SC
WHERE F.ID = SC.ID
AND AVG(SC.Score) > 9
GROUP BY SC.ID;
Run Code Online (Sandbox Code Playgroud)
它返回"#1111 - 无效使用群组功能",我从来没有真正喜欢聚合功能:D
总的来说,我已经意识到我吮吸SQL并且我想训练更多地编写查询,但我在互联网上找到的大多数教程都有非常简单的例子,这对解决这些问题没有多大帮助.也许你们中的一些人可以建议我一个资源,它可以有更复杂,更准备好的数据库和任务(如果我遇到困难,还有答案)来编写查询?
WHERE子句用于比较基表中的值,而HAVING子句可用于过滤查询结果集中聚合函数的结果。
SQL 中添加了 HAVING 子句,因为 WHERE 关键字不能与聚合函数一起使用。
(1) 您必须添加HAVING到您的查询中。
SELECT F.ID, F.FileName, AVG(SC.Score)
FROM Foto F INNER JOIN scoring S ON F.ID = S.ID
GROUP BY F.ID, F.FileName
HAVING AVG(S.Score) > 9
Run Code Online (Sandbox Code Playgroud)
(2)
SELECT U.LoginName, U.Name, U.Surname, AVG(S.Score)
FROM Scoring S INNER JOIN Users U ON S.LoginName = U.LoginName
GROUP BY S.LoginName
Run Code Online (Sandbox Code Playgroud)
希望这个答案能为您下次考试提供更好的背景:)