7

所以我得到了任务,即使在谷歌的帮助下,我仍然无法解决一些问题。也许有人可以提出一些解决方案(是否必须使用 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;

“照片”(照片)和用户表应该很清楚。“评分”表适用于对照片进行评分的用户。每个用户只能对每张照片进行一次评分。任务是:

  1. 编写查询,返回所有 AVG 分数高于 9 的照片的照片 ID、文件名和 AVG(Score),并创建可提高此查询性能的索引。

  2. 编写将返回“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;

它返回“#1111 - 组函数的无效使用”,我从来没有真正喜欢聚合函数:D

总的来说,我意识到我很擅长 SQL,我想训练更多地编写查询,但是我在互联网上找到的大多数教程都有非常简单的示例,对解决这些问题没有多大帮助。也许你们中的一些人可以向我建议一个资源,该资源将具有更复杂、准备好的数据库和任务(如果我遇到困难,也有答案)来编写查询?

4

3 回答 3

4

可能有帮助的一件事是学习使用显式 JOIN 语法(使用ON子句)而不是老式的隐式语法(使用WHERE子句)。这应该有助于让您将来更清楚地了解情况。

您的错误是您需要使用HAVING子句对聚合函数的结果进行子集化。您不能在WHERE子句中使用聚合函数。

所以,试试这个:

SELECT F.ID
     , F.FileName
     , AVG(SC.Score)
FROM   Foto F
JOIN   scoring SC
ON     F.ID = SC.ID
GROUP BY F.ID, F.FileName 
HAVING AVG(SC.Score) > 9

祝你好运!

编辑:了解任何数据库的最佳地点是您正在使用的特定数据库的文档页面。在你的情况下,看这里

于 2013-01-19T22:09:27.760 回答
4

WHERE 子句用于比较基表中的值,而 HAVING 子句可用于过滤查询结果集中聚合函数的结果。

HAVING 子句被添加到 SQL 中,因为 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

(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

SQLFiddle 演示

希望这个答案能给你下次考试更好的背景:)

于 2013-01-19T22:13:17.607 回答
1

选择中的所有内容都必须在 GROUP BY 或聚合函数中。

SELECT F.ID, F.FileName, AVG(SC.Score)
FROM Foto F
INNER JOIN scoring SC
ON F.ID = SC.ID
GROUP BY F.ID, F.FileName 
HAVING AVG(SC.Score) > 9

您将要加入或搜索的任何列都可以从索引中受益。

于 2013-01-19T22:03:58.310 回答