0

2 つの多対多の関係「構造」を確立しました。1 つは映画とそのアンビエンス用です。

CREATE TABLE Films (  
id INT NOT NULL AUTO_INCREMENT,  
PRIMARY KEY(id),    
Title VARCHAR(255));

CREATE TABLE Ambiences (  
id INT NOT NULL AUTO_INCREMENT,   
PRIMARY KEY(id),  
ambienceName VARCHAR(255));

CREATE TABLE Films_Ambiences (
film_id INT NOT NULL,  
ambience_id INT NOT NULL,  
PRIMARY KEY (film_id, ambience_id),  
FOREIGN KEY (film_id) REFERENCES Films(id) ON UPDATE CASCADE,  
FOREIGN KEY (ambience_id) REFERENCES Ambiences(id) ON UPDATE CASCADE);

2 つ目は、映画とその詳細に関するものです。

CREATE TABLE Specifics (  
id INT NOT NULL AUTO_INCREMENT,   
PRIMARY KEY(id),  
specificName VARCHAR(255));

CREATE TABLE Films_Specifics (film_id INT NOT NULL,
specific_id INT NOT NULL,
PRIMARY KEY (film_id,specific_id),
FOREIGN KEY (film_id)
REFERENCES Films(id) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (specific_id)
REFERENCES Specifics(id) ON UPDATE CASCADE ON DELETE CASCADE);

すべての結果を 1 つのテーブルに表示したい (映画のタイトルでグループ化)。言い換えれば、私は欲しい:

+------+--------------+-----------------+
| | タイトル | 雰囲気 | 仕様 |
+------+--------------+-----------------+
| | フィルム1 | 面白い、怖い | エイリアン |
| | フィルム2 | 悲しい、怖い | 騎士、エイリアン |
| | フィルム3 | 面白い | 騎士 |
| | . | | | | | |
| | . | | | | | |
| | . | | | | | |
+------+--------------+-----------------+

アンビエンスのみで、次のようにいくつかの JOIN と GROUP_CONCAT を使用しました。

SELECT *,GROUP_CONCAT(ambienceName SEPARATOR ', ') AS ambiences
FROM Films AS f 
INNER JOIN Films_Ambiences as fa ON f.id = fa.film_id           
INNER JOIN Ambiences AS a ON a.id = fa.ambience_id
GROUP BY Title

アンビエンスと詳細については、2 つの GROUP_CONCAT を使用してみましたが、うまくいきませんでした。
必要に応じて、ここにSQLFiddleがあります。

ここでの追加の質問は、多対多の「構造」が 3 つ以上ある場合、それは意味があるかということです。

アップデート

詳細のない映画も展示したいと思います。@Kickstart によって提案されたソリューションには、それが含まれていないようです。

つまり、具体的ではあるが具体性のない映画を展示したいfunny, sad。これが更新されたSQLFiddle です- film4 が選択されていないことがわかります。

4

2 に答える 2

1

おそらくGROUP_CONCATでDISTINCTを使用してください

SELECT *,
GROUP_CONCAT(DISTINCT ambienceName SEPARATOR ' ') AS ambiences, 
GROUP_CONCAT(DISTINCT specificName SEPARATOR ' ') AS specifics 
FROM Films AS f 
LEFT OUTER JOIN Films_Ambiences as fa ON f.id = fa.film_id          
LEFT OUTER JOIN Ambiences AS a ON a.id = fa.ambience_id
LEFT OUTER JOIN Films_Specifics as fs ON f.id = fs.film_id          
LEFT OUTER JOIN Specifics AS s ON s.id = fs.specific_id
GROUP BY Title
于 2013-07-12T20:25:58.683 に答える