[英]JOIN data from two many-to-many SQL structures
我建立了兩個多對多的關系“結構”。 一種是針對電影及其環境:
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);
第二個是關於電影及其細節的:
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);
我想將所有結果顯示在一個表中(按電影標題分組)。 換句話說,我想要:
+-------+--------------+-----------------+ | Title | Ambiences | Specifics | +-------+--------------+-----------------+ | film1 | funny, scary | aliens | | film2 | sad, scary | knights, aliens | | film3 | funny | knights | | . | | | | . | | | | . | | | +-------+--------------+-----------------+
僅在環境中,我使用了一些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
由於環境和細節的原因,我嘗試使用兩個GROUP_CONCAT by沒有解決問題。
如果您願意,這是一個SQLFiddle 。
這里的另一個問題是,如果我擁有三個或更多個多對多“結構”,這有意義嗎?
UPDATE
我也想展示沒有細節的電影。 @Kickstart提出的解決方案似乎並未包含該內容。
換句話說,我想展示一部funny, sad
但沒有細節的電影。 這是更新的SQLFiddle-您會發現未選擇film4。
也許在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
嘗試這個:
select Title,
GROUP_CONCAT(distinct(trim(AMBIENCENAME)),',')as Ambience,
GROUP_CONCAT(distinct(trim(specificName)),',')as Specifics
from Films f join
Films_Ambiences fa on f.id = fa.film_id join
Ambiences a on a.id=fa.ambience_id join
Films_Specifics fs on fs.film_id = f.id join
Specifics s on s.id = fs.specific_id
group by title;
結果幾乎與您說的要保存一些流浪逗號的結果相同。
____________________________________________
|TITLE |AMBIENCE |SPECIFICS |
|-------|---------------|------------------|
|film1 |sad, |aliens, |
|film2 |sad,,happy, |monsters, |
|film3 |happy, |monsters,,aliens, |
--------------------------------------------
編輯:滿足以下更新要求的新查詢
select Title,
GROUP_CONCAT(distinct(AMBIENCENAME),',')as Ambience,
CASE WHEN specificName is null then 'none' else GROUP_CONCAT(distinct(specificName ),',') END as Specifics
from
Films f left join
Films_Ambiences fa on f.id = fa.film_id left join
Ambiences a on a.id=fa.ambience_id left join
Films_Specifics fs on fs.film_id = f.id left join
Specifics s on s.id = fs.specific_id
group by title;
結果:
__________________________________________
|TITLE |AMBIENCE |SPECIFICS |
|----------------------------------------|
|film1 |sad, |aliens, |
|film2 |sad,,happy, |monsters, |
|film3 |happy, |aliens,,monsters,|
|film4 |sad,,happy, |none |
------------------------------------------
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.