2017-12-13 14 views
1

ここに私の問題があります。私は2つのテーブルの科目と成績を持っています。テーブル内のすべての要素に対して結合クエリが正しく機能しない

CREATE TABLE `grades` (
    `gradesID` int(11) NOT NULL, 
    `studentBook` int(11) DEFAULT NULL, 
    `subjectID` varchar(5) DEFAULT NULL, 
    `grade` int(5) DEFAULT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


INSERT INTO `grades` (`gradesID`, `studentBook`, `subjectID`, `grade`) VALUES 
(1, 1034, 'AD356', 9), 
(2, 1034, 'CS102', 10), 
(3, 1034, 'CS103', 9), 
(4, 1034, 'CS220', 5) 

CREATE TABLE `subjects` (
    `subjectID` varchar(5) NOT NULL, 
    `name` varchar(50) DEFAULT NULL, 
    `espb` smallint(6) DEFAULT NULL, 
    `number_of_classes_per_week` smallint(6) DEFAULT NULL, 
    `number_of_practices_per_week` smallint(6) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- 
-- Dumping data for table `subjects` 
-- 

INSERT INTO `subjects` (`subjectID`, `name`, `espb`, `number_of_classes_per_week`, `number_of_practices_per_week`) VALUES 
('AD356', '3D modeling Maya', 10, 3, 3), 
('CS101', 'Introduction to object-oriented programming', 10, 3, 4), 
('CS102', 'JAVA 2', 10, 3, 4), 
('CS103', 'Algorithms', 8, 3, 3), 

私が受験しようとした学生のすべての被験者数のすべてを見つけるために、クエリを参加させる必要がある(関係なく、彼らが合格したか失敗した).AND私は、結果として表示する必要があります 科目。 subjectID、subjects.name、件名ごとのクラスとプラクティスの総数、試験に合格した生徒の数(合否にかかわらず)。 は、これが私の試みです:

SELECT 
    subjects.subjectID, 
    subjects.name, 
    (subjects.number_of_classes_per_week+subjects.number_of_practices_per_week) AS 'Totall number of classes per week', 
    COUNT(grades.subjectID) AS 'Number of students that tried to pass' 
FROM 
    subjects, 
    grades 
WHERE 
    subjects.subjectID = grades.subjectID AND 
    grade >= 5; 

しかし、私は最初その主題と私が持っているしたいと思います結果はこのようなものです すべての被験者のための学生の総数のためのクラスの彼の数をsubjectIDます:

subjectID  name       Totall number of classes per week      Number of students that tried to pass 
AD356 3D modeling Maya     6    10 
CS101 Introduction to object-oriented programming 7  4 
CS102 'JAVA 2'       7    5 
CS103 Algorithms      6    4 
+0

サンプルデータと予想される出力を提供してください。ありがとう。 –

+0

@MartinSchneider私はnow.Just a momentを編集します – Mapet

+1

あなたは集計関数 'COUNT()'を持っていますが、一致する 'GROUP BY'はありません。 'GROUP BY 1,2,3 'を追加して、クエリを結果セットの最初の3つのカラムでグループ化します。まだ奇妙な結果が残っている場合はお知らせください。 –

答えて

1

何をカウントするか、つまりカウントするためのグループ化識別子としてどのフィールドを使用するかをMySQLに指示する必要があります。

あなたの場合、各科目のすべての成績(5以上の成績)を数えたいので、それはsubjectIDになります。

つまり、あなたのWHERE文の後に追加する必要があります。

GROUP BY subjectID

そして、あなたが行われる必要があります。

+0

ありがとう – Mapet

1

あなたはグループ化せずにcount()集合関数を使用しているので、mysqlはただ1つの行を返します。試してみてください:

SELECT 
    subjects.subjectID, 
    subjects.name, 
    (subjects.number_of_classes_per_week+subjects.number_of_practices_per_week) AS 'Totall number of classes per week', 
    COUNT(distinct grades.studentBook) AS 'Number of students that tried to pass' 
FROM 
    subjects 
JOIN grades ON grades.subjectID = subjects.subjectID 
GROUP BY subjects.subjectID 
関連する問題