2017-09-13 259 views
1

我有以下列表根據每週存檔創建的表格。如何使用相同的表模式查詢多個SQL表?

dbtable 
dbtable_01_04_2017 
dbtable_01_07_2017 
dbtable_02_09_2017 
dbtable_03_06_2017 
dbtable_05_08_2017 
dbtable_06_05_2017 
dbtable_08_04_2017 
dbtable_08_07_2017 
dbtable_09_09_2017 
dbtable_10_06_2017 
dbtable_12_08_2017 
dbtable_13_05_2017 
dbtable_15_04_2017 
dbtable_15_07_2017 
dbtable_17_06_2017 
dbtable_19_08_2017 
dbtable_20_05_2017 
dbtable_22_04_2017 
dbtable_22_07_2017 
dbtable_24_06_2017 
dbtable_26_08_2017 
dbtable_27_05_2017 
dbtable_29_04_2017 
dbtable_29_07_2017 

他們都具有完全相同的立柱結構:

TIME_STAMP,USERNAME,INFO,原因

我需要使用一次相同的查詢,當然只能通過查詢所有的人在下面的示例查詢中更改表名。

SELECT * FROM dbtable WHERE USERNAME="XXXX"; 

我GOOGLE了一下,希望有一種方法來通配名稱在查詢中,但我瞭解到,SQL不支持。

基本上,我在尋找某種for循環迭代查詢到多個表。

請注意,新表將每週根據我們的檔案自動化添加。

+1

請證明有周表。然後我們會試着解釋爲什麼這樣沒有優勢。 –

回答

0

UNION ALL是最終溶液。

SELECT * FROM dbtable WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_04_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_01_07_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_02_09_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_03_06_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_05_08_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_06_05_2017 WHERE `USERNAME` LIKE '$variable' UNION ALL 
SELECT * FROM dbtable_08_04_2017 WHERE `USERNAME` LIKE '$variable' 

我能夠通過使用上面的SQL查詢來實現我所需要的。

2

這太長了評論。

問題是你的數據結構。具有相同格式的多個表通常是一個壞主意。你應該有一張表,並且有一個日期欄。

哦,等等,你關心的性能,因爲每個現有的表大。這就是(大多數)數據庫支持分區的原因。您可以在documentation中閱讀。

如果不走這條路線,一種可能性是創建一個視圖,所有表 - 然後當你添加一個表改變視圖,以包含最新的表。當然,查詢可能最終會讀取所有表格,因此它們效率不高。

正確的解決方案是使用具有多個分區的單個表。

+1

或許按時間劃分的唯一理由是如果您打算清除「舊」數據。請參閱http://mysql.rjweb.org/doc.php/partitionmaint –

0

您可以編寫一個查詢哪些表存在,並對這些表的SELECT的存儲過程。