2017-09-25 12 views
0

だから私は現在3つのデータベースを持っています。これは、各テーブルを生成するSQLコードです。複数の値が1つの列にありますMYSQL

CREATE TABLE `Course` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(25) NOT NULL, 
    `startTime` time NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `School` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `schoolname` varchar(25) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE `SchoolCourse` (
    `schoolid` int(11) NOT NULL, 
    `courseid` int(11) NOT NULL, 
    PRIMARY KEY (`schoolid`,`courseid`), 
    KEY `FK_course` (`courseid`), 
    CONSTRAINT `FK_course` FOREIGN KEY (`courseid`) REFERENCES `Course` (`id`), 
    CONSTRAINT `FK_Student` FOREIGN KEY (`schoolid`) REFERENCES `School` (`id`) 
); 

これらのテーブルとの私の目標は、それは私がこれを行う方法を見つけ出すように見えるカントこの

--------------------------------------------------- 
|School Name |   Courses     | 
--------------------------------------------------- 
| School1  | Course1, Course2, Course3   | 
| School2  | Course1, Course3     | 
| School3  | Course3       | 
| School4  | Couse1, Course2, Course3, Course4 | 
--------------------------------------------------- 

のようなものを見えるようにすることです。私はこのような値を入力しようとしました。

INSERT INTO 'ShcoolCourse' VALUES (
(1, 1), (1, 2), (1, 3), 
(2, 1), (2, 3), 
(3, 3), 
(4, 1), (4, 2), (4, 3), (4, 4)); 

するとそこから、私が参加し、これまでに1列に値が、運を入れてみてくださいを実行することになり、 私は他の質問で周りを見回していると、それらのいくつかは、同じ考えを持ってではなく、まさに私は です。どんな助けでも大いに感謝します。

+0

いけないそれを行う、それは正規の規則に従ってではありません。 – nobalG

+0

@nobalGこのとき、何がうまくいくのでしょうか?もし私がこのようにしないとしたら? – cunniemm

+0

https://stackoverflow.com/a/9699957/681929 – nobalG

答えて

2

現在のスキーマは正規化されており、完全に正常です。あなたは、このようなカンマ区切りの出力をしたい場合は、単にGROUP_CONCATを使用して照会時に、それを生成します。

SELECT 
    t1.id, 
    t1.schoolname AS `School Name`, 
    GROUP_CONCAT(t3.name) AS Courses 
FROM School t1 
LEFT JOIN SchoolCourse t2 
    ON t1.id = t2.schoolid 
LEFT JOIN Course t3 
    ON t2.courseid = t3.id 
GROUP BY 
    t1.id, 
    t1.schoolname 

二つの異なる学校が偶然持っているかもしれないという可能性があるため、私は凝集のidschoolnameの両方が含まれることに注意してください同じ名前であり、それらを区別するための何らかの方法が必要です。

+0

ちょうど不思議の国の国々にして、私はそれがデータを保存する正しい方法であることを確認したいですか?ユーザーがデータの格納と検索のみを行っているように見えるかもしれませんが、将来的にはテーブルが正規化されていないために複雑になります。 – nobalG

+0

私の答えはデータの保存とは関係ありません。あなたのテーブルの設定はよく見え、正規化されており、行く方法です。 CSVデータを保存せずに、クエリを実行するときに必要なものだけを構築してください。 –

1

あなたはgroup_concatGROUP BYを使用することができます。

select 
    s.schoolname `School Name`, 
    group_concat(c.name) Courses 
from school s 
left join schoolcourse sc on s.id = sc.schoolid 
left join cource c on c.id = sc.courseid 
group by s.id 
+0

ありがとうございます。これはちょうど他の答えのように素晴らしい仕事をしました。 – cunniemm

関連する問題