以下代码效果很好。我有一个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 :(得分: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";
答案 1 :(得分:0)
将它放在子查询中可能是最安全的:
$subQueryParts = array();
foreach($tables as $table)
$subQueryParts[] = "SELECT site, votes_up FROM $table WHERE LENGTH(site)";
$subQuery = implode(" UNION ALL ", $subQueryParts);
如果可能,您应该遵循Bill Karwin的建议并将所有书籍存储在一个表格中。动态表名称很难搜索和管理,并且不能很好地优化。