2010-12-23 56 views
2

如何加入3代關係表與結構:如何加入3個關係表

t1 | id 
t2 | id | rating 
t3 | source_id | relation 

T3存儲該t1和t2同時使用一個場的數據。所以source_id字段可以是t1的id或t2的id。

input : t1 id 
output : t2 rating 

一個例子:

**t1** 

id | 
--------- 
42 | 

**t2** 

id | rating 
------------- 
37 | 9.2 

**t3** 

id | source_id 
-------------- 
42 | 1 
37 | 1 
26 | 2 
23 | 1 

我想要的是讓9.2輸出與輸入42。

你可以做一個SQL查詢嗎?

+0

`source_id`是什麼意思?雖然它們屬於不同的表格,但對於'42'和'37'都是'1'。 – Quassnoi 2010-12-23 14:30:10

+0

您的表格結構不清楚。 `source_id`似乎沒有做你所描述的。對於你想要的連接,應該有一個包含元組的關係(42,37)。 – OrangeDog 2010-12-23 14:31:49

+0

我也沒有得到它。爲什麼42的輸出是9.2? Isnt 9.2與37相關? //哦,我想我明白了。 42,37和23的輸出應該是9.2。是嗎? – Michael 2010-12-23 14:32:24

回答

2

該查詢會給你對你的數據所需的輸出,但不認爲這是正確的模型:

SELECT t2.rating 
FROM t1 
JOIN t3 t31 
ON  t31.id = t1.id 
JOIN t3 t32 
ON  t32.source_id = t31.source_id 
JOIN t2 
ON  t2.id = t32.id 
WHERE t1.id = 42 
1

我找到了解決辦法,你有什麼感想?

SELECT t2.rating 
FROM t3 AS t3 
inner join t1 AS t1 on t1.id = t3.id 
inner join (SELECT source_id, rating 
FROM t3 AS t32 
inner join t2 AS review on t2.id = t32.id) as second on second.source_id = t3.source_id 
where t1.id = 42 limit 0,1 
2

你「關係表」是一種災難;所需的SQL代碼(SQL旨在導航關係數據庫)將會更加糟糕,從不完整或不穩定。編碼問題是相應的二階問題,它們在第一階中識別錯誤。

首先,針對您放置的關係數據庫系統準確地標準化和建模您的數據;並且您可以使用SQL關係語言。然後代碼將變得簡單,簡單,直接和完整。

如果你想讓我對數據建模,那很好。但是我需要比隱祕的Id列更多的信息;我需要實體和專欄的名稱,它們是什麼意思,它們是如何實際相互關聯的。

迴應評論

是的,你當然可以有一個列,它是一個外鍵引用多個父表。但是你不能(在關係型數據庫中)有一列是或者一個另一個父表:這將導致孤兒,老鼠以及各種容易避免的編碼恐懼。