2009-08-18 16 views
0

下面的代碼很好用。我有一個MySQL數據庫,其中包含按不同類別分類的書籍標題。在下面的代碼中,變量「site」代表書名。每個類別都由MySQL數據庫中的不同表格表示。當它的值爲空時排除變量

下面的代碼通過所有類別(MySQL表格)的總票數排名前25名書籍(網站)。我試圖排除空白書名(即site ='')。我怎樣才能做到這一點?

我試過在幾個地方插入WHERE site != ''但我收到一條錯誤消息。所以我想我問,我在哪裏可以插入WHERE site != ''

由於提前,

約翰

<? 

mysql_connect("mysqlv10", "username", "password") or die(mysql_error()); 
mysql_select_db("database") or die(mysql_error()); 

$result = mysql_query("SHOW TABLES"); 
$tables = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $tables[] = '`'.$row["Tables_in_bookfeather"].'`'; 

} 

$subQuery = "SELECT site, votes_up FROM ".implode(" UNION ALL SELECT site, votes_up FROM ",$tables); 
// Create one query that gets the data you need 
$sqlStr = "SELECT site, sum(votes_up) sumVotesUp 
      FROM (
      ".$subQuery.") subQuery 
      GROUP BY site ORDER BY sum(votes_up) DESC LIMIT 25"; 
$result = mysql_query($sqlStr); 

$arr = array(); 
echo "<table class=\"samples2\">"; 
while ($row = mysql_fetch_assoc($result)) { 
    echo '<tr>'; 
    echo '<td class="sitename2"><a href="booklookup3.php?entry='.urlencode($row["site"]).'&searching=yes&search=search">'.$row["site"].'</a></td>'; 
    echo '<td>'.$row["sumVotesUp"].'</td>'; 
    echo '</tr>'; 
} 

echo "</table>"; 



?> 

回答

0

這可能是最安全的把它的子查詢:

$subQueryParts = array(); 
foreach($tables as $table) 
    $subQueryParts[] = "SELECT site, votes_up FROM $table WHERE LENGTH(site)"; 
$subQuery = implode(" UNION ALL ", $subQueryParts); 

如果可能的話,你應該遵循比爾Karwin的意見,並存儲所有你的書在一張桌子上。動態表名非常難以搜索和管理,並且它們不能很好地進行優化。

+0

謝謝......它的工作原理。 – John 2009-08-19 00:00:50

8

你不應該爲每本書類別單獨的表。我不相信你有這麼多書,這些表中的任何一個都會變得太大。通過拆分表可能獲得的任何可擴展性優勢被必須執行這些UNION查詢的複雜性所抵消。

這裏就是我想要做的:

  • 統一的表到一個表。
  • 添加Categories表。
  • 將書籍與具有多對多表格的類別關聯起來。

然後您的SQL查詢變得簡單多了:

$sqlStr = "SELECT site, votes_up FROM Books 
      WHERE site IS NOT NULL AND site <> '' 
      ORDER BY votes_up DESC LIMIT 25"; 
相關問題