2013-04-17 34 views
2

我想知道是否可以爲所有具有相同名稱但末尾具有不同數字的表創建動態聯合查詢。我創建了一個系統,但以他們自己的表,如每個用戶:Mysql使用類似名稱的SELECT和UNION多個表

user_table_ $用戶ID

我在PHP實現這一點,但真的想創建一個更加動態的代碼。我目前有2-3個嵌套查詢來抓取每張表的帖子,而不會對Web服務器或數據庫造成壓力。

我想我可以計算用戶的數量在用戶登錄狀態表,並創建一個for循環:

for ($i = 1; $i >= $usrCount; $i++) 
{ 
    $queryArray[] = "(SELECT post_title, post_description FROM user_table_" . $i . ") UNION"; 
} 

但是,如果用戶數量是非常多的PHP腳本可能需要很長的時間來加載。有什麼辦法可以讓我的Mysql數據庫創建一個動態查詢基於名稱如=「user_table_%」

如果有任何建議,請讓我知道。

謝謝。

+2

一切好像非規範的數據庫模式爲每個用戶 –

+1

我覺得明顯的建議是一定要規範你的模式,所以你沒有創建表的第一表爲您的系統中的每個用戶。 –

+0

嘗試存儲過程也性能得到改善 – shola

回答

0

你不能,即使你發現一個聰明的黑客,你不應該。

最好的辦法就是重新考慮一下你的數據庫模式。我向你保證,你目前的結構是壞的,非常非常糟糕。如果偶然你開發新的Facebook呢?你會有十億張桌子嗎?

搜索關於「數據庫標準化」和「第三範式」

+0

我有一個更好的主意。因爲帖子將按類別處理,我想我可以根據類別和UNION製作表格。 – Tristian

+0

當然,這個答案的重點是讓你重新思考你的數據庫模式。任務完成! –

0

谷歌似乎像你應該有一個包含user_id場只有一個表user_table

現在,如果你仍想保留當前的模型,需要MySQL來構建查詢,也許你可以:

SHOW TABLES LIKE "user_table_%"; 

創建臨時表,併爲每個表做INSERT SELECT

但同樣,它幾乎沒有建議,至少可以說

1

也許是更好的正常化您的數據庫,但如果你需要一個動態查詢,你可以這樣做:

SELECT 
    GROUP_CONCAT(
    CONCAT(
     'SELECT * FROM `', 
     TABLE_NAME, 
     '`') SEPARATOR ' UNION ALL ') 
FROM 
    `INFORMATION_SCHEMA`.`TABLES` 
WHERE 
    `TABLE_NAME` REGEXP '^user\_[0-9]*$' 
INTO @sql; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

請參閱小提琴here

0

第一標準化表格,暫且可以運行此查詢

SELECT POST_TITLE,post_description FROM(選擇INFORMATION_SCHEMA表名在表格名像 'user_table_%';

+0

我正與STT LCU一起處理這個問題,因爲處理數百張表是一個糟糕的主意。# – Tristian

0

這應該工作的罰款(但考慮「數據庫規範化」)

for ($i = 1; $i >= $usrCount; $i++){ 
    $queryArray[$i] = "(SELECT post_title, post_description FROM user_table_".$i.")"; 
}  
$sql = implode(' UNION ', $queryArray[$i]);