2009-12-15 146 views
1

我有一個包含500多個表的數據庫,每個表具有相同的結構,其中包含來自傳感器的歷史數據。我試圖想出一個查詢來查找,例如,傳感器n超過x的所有實例。問題是表是動態的,查詢必須能夠動態獲取表的列表。MySql:查詢多個相同的動態表

我可以查詢INFORMATION_SCHEMA.TABLES拿到表的列表,像這樣:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'database_name'; 

我可以用它來創建程序中的循環,然後反覆查詢數據庫,但它似乎像應該有辦法讓MySql做多表搜索。

我還沒有能夠使存儲過程的作品,但我可以找到的例子通常用於搜索任何列中的字符串。我想專門查找所有表中存在的特定列中的數據。我承認我不明白如何正確使用存儲過程,也不知道如何解決這個問題。

內環路示例查詢是:

SELECT device_name, sensor_value 
FROM device_table 
WHERE sensor_value > 10; 

嘗試以下不工作:

SELECT device_name, sensor_value 
FROM 
    (
    SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name' 
    ) 
WHERE sensor_value > 10; 

這導致一個錯誤:「每一個派生的表必須有自己的別名。 「

目標是讓所有具有給定傳感器值的設備在其日誌(表格)中的任意位置出現。

最終,一旦我獲得了表的列表,是否應該只在我的程序中循環,或者是否有更高效的查詢結構?

回答

0

最終解決這個問題,我從單獨的表結果和做我的循環和比較的代碼。後來,將所有傳感器數據合併到一個表格中,並使用以前缺失的索引對錶格進行優化,效率更高。

這個故事的寓意是適當的表結構是消除大量編碼頭痛的關鍵!

1

你可以遍歷所有的表動態創建一個單一的查詢是這樣的:

SELECT device_name, sensor_value FROM device_table WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table2 WHERE sensor_value > 10 
UNION 
SELECT device_name, sensor_value FROM device_table3 WHERE sensor_value > 10; 
+0

對我來說,這與我目前在程序代碼中執行的循環基本相同。我仍然必須爲每個聯合生成表名。這是一個可行的解決方案,但不幸的不是我所希望的。 – JYelton 2009-12-15 23:51:08

0

你將不得不創建一個存儲過程。 您需要一個循環遊標,它將穿過每條記錄

SELECT table_name FROM information_schema。表 WHERE table_schema ='database_name';

然後你就會想建立一個長SQL statment像由jbochi提供的一個

@Statement = CONCAT(@Statement, 「UNION SELECT設備名,如Sensor_value FROM」,@table_name,「WHERE如Sensor_value > 10「);

一旦大型查詢建成你會

PREPARE語句FROM @Statement exectute它;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

注:我真的不知道該怎麼辦了循環光標,對不起

+0

我們在同一條船上,循環遊標的事情!無論你如何接近它,我都認爲這是一個循環。程序代碼中的循環起作用,對數據庫進行如此多的調用似乎很笨拙。 – JYelton 2009-12-15 23:52:48

+0

http://www.brainbell.com/tutorials/MySQL/Working_With_Cursors.htm 可能會幫助您使用遊標。我將在稍後嘗試,看看我是否可以學習它。 – MindStalker 2009-12-16 17:20:42