当值为空时排除变量

时间:2009-08-18 23:33:17

标签: php mysql

以下代码效果很好。我有一个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>";



?>

2 个答案:

答案 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的建议并将所有书籍存储在一个表格中。动态表名称很难搜索和管理,并且不能很好地优化。