7

それで私はタスクを手に入れましたが、Googleの助けを借りてもまだ解決できていないタスクがいくつかあります. 誰かがいくつかの解決策を提案できるかもしれません (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;

"Foto"(写真) と Users テーブルはかなり明確なはずです。表「採点」は、写真を評価するユーザー用です。各ユーザーは、各写真を 1 回だけ評価できます。タスクは次のとおりでした。

  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

WHERE句はベーステーブルの値を比較するために使用されますが、HAVING句はクエリの結果セット内の集計関数の結果をフィルタリングするために使用できます。

WHEREキーワードを集計関数で使用できなかったため、HAVING句がSQLに追加されました。

(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 に答える
4

ON役立つかもしれないことの 1 つは、昔ながらの暗黙的な構文 (節を使用) の代わりに、明示的な JOIN 構文 (節を使用) を使用することを学ぶこと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 に答える
1

select 内のすべてが 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 に答える