2009-08-20 19 views
0

下面的代碼返回MySQL數據庫中前25個最近創建的表。檢索前25個表(由字段值定義)

$index = mysql_query("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='bookfeather' order by CREATE_TIME desc limit 25"); 

每個表的格式如下:

id INT(11) NOT NULL auto_increment, site VARCHAR(350) NOT NULL, votes_up BIGINT(9) NOT NULL, votes_down BIGINT(9) NOT NULL, PRIMARY KEY(id), UNIQUE (site) 

我想改變的代碼顯示:

  1. 排名前25位表基礎上的「網站不同的條目數「

  2. 基於」votes_up「之和的前25個表格

我該怎麼做?

由於提前,

約翰

+0

這對於一張表格來說是微不足道的。 http://stackoverflow.com/questions/1297138/excluding-a-variable-when-its-value-is-blank/1297159#1297159 – deceze 2009-08-20 05:14:01

+1

我的意思是說,你對錶格不感興趣,對書籍類別重新感興趣(我冒險猜測它仍然是關於這個話題的)。您可以使用固定數量的表格完美實現您的書籍類別,這就是MySQL優化的目標。你當然可以使用多個動態表,但是這樣做會很難,因爲這有點「元SQL」。 – deceze 2009-08-20 05:22:02

+1

是的,圖書的類別應該是數據,而不是元數據。 – 2009-08-20 05:30:48

回答

0

1.上25桌基於對 「網站」

IIUC不同的條目數, 「網站」 是獨一無二的,所以你應該能夠:

select 
    TABLE_NAME, 
    ifnull(TABLE_ROWS, 0) as SITES 
from INFORMATION_SCHEMA.TABLES 
    where TABLE_SCHEMA='bookfeather' 
order by SITES desc limit 25 

但用TABLE_ROWS代替no。獨特的SITE記錄眨眼和點頭是作弊 - 更好的重新設計。 :)基於「votes_up」

如果不能,不管出於什麼原因,按照優秀建議重新設計的總和

2.排名前25位的表,你就必須以編程方式遍歷在每張桌子上。在你的代碼可能遍歷SHOW TABLES,積累的

select 'tblName', ifnull(sum(VOTES_UP), 0) as UPVOTES from tblName 

整理你的累積行的第二場和修剪的這前25

一個變種結果牽涉這使彙總表跟蹤表和總和()'d UPVOTES,可能由cron週期性地重新寫入,由每個表格觸發器動態更新,或者在VIEW(對於每個新表格重新編碼爲CREATEd)中呈現,其爲UNION的所有組成疑問。

但是不要做任何這些。 :)切換到單表設計(可能要求您的存儲引擎進行分區,如果這是一個問題)。