2011-12-12 92 views
1

這個問題以前曾被問過,但從未真正回答過(至少是我想要這樣做的方式)。我在我的數據庫中有三個表格,threads,responsesvotes。我只需要他們分享id字段。所以,我可以這樣做如何使多個表共享MySQL中的id列

SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v 
WHERE id = 15 

,只會檢索線程的響應或(獨家)投票記錄使用id = 15

有一個可能的方式做到這一點,而無需創建一個額外的表?我不是問這是否是一個好主意(這可能不是),但是如果可能的話以及如何去做。

+1

SQL表是扁平結構。如果他們要通過鍵共享一個ID,那麼這三個表中的每一個都需要有一個ID列。在一個表(可能是線程)上,它是主鍵,而另外兩個表是一個返回到線程的外鍵。 –

回答

0

您的選擇會拋出錯誤,因爲where子句中的id字段不明確。我想這三個表中的所有字段都有一個id字段。

SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v 
WHERE id = 15 

所以,即使id字段這些領域之間的「不知何故共享」,你必須讓你的where子句中明確:

SELECT * FROM threads AS t JOIN responses AS r JOIN votes AS v 
WHERE t.id = 15 

此外,我想線程和響應有多對一這意味着可以有多個對應於單個線程的響應。這意味着responses表將具有thread_id字段。 responses表中的id字段的值不能與對應的thread記錄中的id字段具有相同的值,因爲id字段在兩個表中都必須是唯一的。

相同的邏輯去responsesvotes之間的關係(一個響應會有很多票)。

因此我得出結論:在這三個表格之間沒有可能的方式共享id字段

+0

不錯,具體答案,謝謝! – federicot

1

如果我理解正確,您想獲取線程,或者響應,或者使用id = 5進行投票。沒有機會在表中提供id字段唯一性(即阻止創建響應並使用相同的id值投票) MySQL,但你可以在你的應用程序中完成。

而且你可以獲取所需的一行是這樣的:

SELECT id, name, 'thread' AS `type` FROM threads WHERE id=5 
UNION 
SELECT id, name, 'response' AS `type` FROM responses WHERE id=5 
UNION 
SELECT id, name, 'vote' AS `type` FROM votes WHERE id=5