2009-01-03 85 views
73

好吧,這裏是我的困境我有一個數據庫設置了大約5個表,所有的數據結構完全相同。數據以這種方式分離出來用於本地化目的,並將總共約450萬條記錄分開。MySQL - 從多個表中選擇所有結構相同但數據不同的數據

大部分時間只需要一張桌子,一切都很好。但是,有時需要來自2個或更多表的數據,並且需要按照用戶定義的列進行排序。這是我遇到問題的地方。

數據列:

id, band_name, song_name, album_name, genre 

MySQL的statment:

SELECT * from us_music, de_music where `genre` = 'punk' 

MySQL的吐出了這個錯誤:

#1052 - Column 'genre' in where clause is ambiguous 

很顯然,我這樣做是錯誤的。任何人都在意爲我闡明這一點?

回答

167

我認爲你正在尋找的UNION條款,一拉

(SELECT * from us_music where `genre` = 'punk') 
UNION 
(SELECT * from de_music where `genre` = 'punk') 
+0

謝謝你,我的作品究竟如何​​需要:) – Jayrox 2009-01-03 20:09:40

+0

好主意!一票。 – Sagotharan 2011-08-01 18:06:53

+0

@ mihai-limban - 抱歉打擾你,但是有沒有辦法從結果集中識別出「哪個結果來自哪個表」。因爲如果我們需要從這個結果集中更新/刪除一條記錄,那就沒有辦法知道了。 – 2012-04-10 13:17:29

18

這聽起來像你會happer有一個表。這五個具有相同的模式,並且有時需要像來自一個表格那樣呈現,以將它們全部放在一個表格中。

添加一個新的列,可以用來區分五種語言(我假設它是語言,因爲你說它是用於本地化的表之間不同)。不要擔心有450萬條記錄。任何真正的數據庫都可以處理這個大小沒問題添加正確的索引,並且將它們作爲單個表進行處理時不會遇到任何問題。

4

以上任何答案都是有效的,或者另一種方法是擴大表名稱包括數據庫名稱,以及 - 如:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk' 
3

列不明確,因爲它出現在兩個表中你將需要完全指定where(或sort)字段,例如us_music.genre或de_music.genre,但是如果要以某種方式將它們結合在一起,通常會指定兩個表。你所處理的結構有時被稱爲分區表,儘管它通常將數據集分成不同的文件,而不是任意分割數據集。如果您負責數據庫結構並且沒有充分的理由對數據進行分區,那麼我將創建一個包含國家代碼的額外「起源」字段的大表,但您可能出於合法性能原因。 使用聯合來加入您感興趣的表http://dev.mysql.com/doc/refman/5.0/en/union.html或使用合併數據庫引擎http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html

3

您最初試圖跨越兩個表創建一個隱式JOIN。這是大多數有經驗的SQL程序員所不悅的,因爲它將表格分開以便與如何組合。

UNION對於表格來說是一個很好的解決方案,但應該沒有理由不能通過合適的索引將它們放入一張表中。我見過在大表中增加正確的索引可以將查詢速度提高三個數量級。

3

union聲明導致大量數據的處理時間。這是好事,在2個步驟進行選擇:

  1. 選擇ID
  2. 然後用它選擇主表
相關問題