質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

2回答

7620閲覧

SELECT文でのエラー

Beginnerman

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2019/07/11 10:15

編集2019/07/11 10:50

以下のような3つのテーブルがあります。
Movies
イメージ説明
Users
イメージ説明
Ratings
イメージ説明

create文です、データはcsvファイルからとってきたものです。

CREATE DATABASE IF NOT EXISTS MovieDB; USE MovieDB; DROP TABLE IF EXISTS Ratings; DROP TABLE IF EXISTS Users; DROP TABLE IF EXISTS Movies; CREATE TABLE Users ( UserID INTEGER PRIMARY KEY, Age INTEGER, Gender CHAR(1), Occupation VARCHAR(20), ZipCode CHAR(5)); CREATE TABLE Movies ( MovieID INTEGER PRIMARY KEY, Title VARCHAR(120), ReleaseDate DATE, UNKNOWN ENUM('T','F'), Action ENUM('T','F'), Adventure ENUM('T','F'), Animation ENUM('T','F'), Children ENUM('T','F'), Comedy ENUM('T','F'), Crime ENUM('T','F'), Documentary ENUM('T','F'), Drama ENUM('T','F'), Fantasy ENUM('T','F'), FilmNoir ENUM('T','F'), Horror ENUM('T','F'), Musical ENUM('T','F'), Mystery ENUM('T','F'), Romance ENUM('T','F'), SciFi ENUM('T','F'), Thriller ENUM('T','F'), War ENUM('T','F'), Western ENUM('T','F')); CREATE TABLE Ratings ( UserID INTEGER, MovieID INTEGER, Rating INTEGER, TS TIMESTAMP, PRIMARY KEY (UserID, MovieID), FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (MovieID) REFERENCES Movies(MovieID) );

次の条件のセレクト文を考えているのですが行き詰っています。
1つ目
50 歳以下のユーザーによる評価が1件もない映画のタイトル。

 映画ごとに50歳以下のユーザーの評価をカウントし、それが0かどうかで判断するというように考えましたが、エラーがでます。

select title from movies,users,ratings where count(movies.movieid = ratings.movieid and ratings.userid = users.userid and age < 50) = 0;
ERROR 1111 (HY000): Invalid use of group function

2つ目
400人以上のユーザーから評価をつけられている映画のタイトルと平均評価を平均評価の高い順に表示。

UserIDをカウントして400以上であるかどうかで考えましたが、エラーが出ます。

select title avg(ratings) as avg_r from movies,users,ratings where movies.movieid = ratings.movieid and ratings.userid = users.userid and count(users.userid) >= 400 order by avg_r desc;
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(ratings) as avg_r from movies,users,ratings where movies.movieid = ratings.movi' at line 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/07/11 10:22

画像ではなくSQLのサンプルはcreate table/insert形式で例示ください
Beginnerman

2019/07/11 10:42

データの中身はcsvファイルからとってきたものです。 CREATE DATABASE IF NOT EXISTS MovieDB; USE MovieDB; DROP TABLE IF EXISTS Ratings; DROP TABLE IF EXISTS Users; DROP TABLE IF EXISTS Movies; CREATE TABLE Users ( UserID INTEGER PRIMARY KEY, Age INTEGER, Gender CHAR(1), Occupation VARCHAR(20), ZipCode CHAR(5)); CREATE TABLE Movies ( MovieID INTEGER PRIMARY KEY, Title VARCHAR(120), ReleaseDate DATE, UNKNOWN ENUM('T','F'), Action ENUM('T','F'), Adventure ENUM('T','F'), Animation ENUM('T','F'), Children ENUM('T','F'), Comedy ENUM('T','F'), Crime ENUM('T','F'), Documentary ENUM('T','F'), Drama ENUM('T','F'), Fantasy ENUM('T','F'), FilmNoir ENUM('T','F'), Horror ENUM('T','F'), Musical ENUM('T','F'), Mystery ENUM('T','F'), Romance ENUM('T','F'), SciFi ENUM('T','F'), Thriller ENUM('T','F'), War ENUM('T','F'), Western ENUM('T','F')); CREATE TABLE Ratings ( UserID INTEGER, MovieID INTEGER, Rating INTEGER, TS TIMESTAMP, PRIMARY KEY (UserID, MovieID), FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (MovieID) REFERENCES Movies(MovieID) );
yambejp

2019/07/11 10:43

ソースはマークダウンして本文に追記してください
guest

回答2

0

select ... avg(カラム名) ...

or

select ... avg(テーブル名.カラム名) ...

投稿2019/07/11 10:34

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

select title from movies,users,ratings where count(movies.movieid = ratings.movieid and ratings.userid = users.userid and age > 50) = 0;

なにをカウントしているかさっぱりわかりませんが

SQL

1select title from movies,users,ratings 2where 1 3and movies.movieid = ratings.movieid 4and ratings.userid = users.userid 5and users.age < 50;

的なことではないのでしょうか?
※質問者さんの意向にあわせて不等号を逆にしました

検証1

ざっくりデータを削ります

SQL

1create table movies(mid int primary key,title varchar(100)); 2insert into movies values(1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'),(5,'eee'),(6,'fff'); 3 4create table users(uid int primary key,name varchar(10),age int); 5insert into users values(1,'AAA',30),(2,'BBB',40),(3,'CCC',55),(4,'DDD',60); 6 7create table ratings(rid int primary key,uid int,mid int,rating int); 8insert into ratings values(1,1,1,10),(2,1,2,20),(3,2,1,15),(4,2,2,20),(5,2,3,12),(6,4,2,30),(7,5,4,20); 9 10select * from movies as t1 11left join ratings as t2 on t1.mid = t2.mid 12and ratings.uid = users.uid 13and users.age < 50;

上記50以下のユーザーuid=1,2が評価したタイトルはmid=1,2,3
評価していないのはmid=4,5,6

SQL

1select * from movies as t1 where 2not exists( 3select 1 from ratings as t2 4inner join users as t3 on t2.uid = t3.uid 5and t3.age < 50 6where mid=t1.mid)

※解説
where not existsは相関サブクエリといいます。
moviesのmidを利用して、サブクエリ内50以下の評価があるmidを
not existsで反転して評価がないものを抽出しています

検証2

サンプル数が少ないのでとりあえず2件以上評価があるもの
mid=1,2とその平均評価

SQL

1select t1.mid,t1.title,t2.avg_rating 2from movies as t1 3inner join ( 4select mid,avg(rating) as avg_rating 5from ratings 6group by mid 7having count(*)>=2 8) as t2 on t1.mid=t2.mid 9order by avg_rating desc

※解説
単純にサブクエリないでmidごとの平均ratingを計算し
n件以上をhavingで抽出しています
group by~having構文は最低限覚える必要があるSQLの一つです
あとはサブクエリとしてmovieに結合しています

投稿2019/07/11 10:27

編集2019/07/11 13:23
yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Beginnerman

2019/07/11 10:39

50歳以下の評価が0のtitleを出力したいので、50歳以下の評価をカウントし、それが0のものをと思いました。 ``` avg > 50 ``` の部分は不等号が反対でした。
yambejp

2019/07/11 10:55

> 50歳以下の評価が0のtitle 評価が0とは、50歳以下の人がまったく評価をあげていないタイトルのこと? それとも何かの評価の点が0点ということ?
Beginnerman

2019/07/11 11:04

評価をしていないタイトルです。評価点ではないです。
yambejp

2019/07/11 11:23

サンプル追記しときました
Beginnerman

2019/07/11 12:52

ありがとうございます。軽い解説を頂ければ幸いです。初心者なのでここまで色んな句を使ったセレクト文を見たことが無かったので。
yambejp

2019/07/11 13:24

解説つけておきました 本ちゃんのサンプルがどう動くか、スピードが確保できるかなどは こちらではなんとも言えないのでチューニングが必要な場合は インデックスを工夫して、SQL文ももっときちんと組まないといけないかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問