簡體   English   中英

從兩個多對多SQL結構中聯接數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM