从MySQL数据库中的多个表中检索值

时间:2009-08-05 20:16:35

标签: php mysql

我有一个名为“bookfeather”的MySQL数据库,其中包含几个包含列表簿的表。在每张表下,每本书都有一定数量的投票。下面的PHP代码允许用户输入书名($ entry),然后返回书籍在所有表格中的总票数($ sum)。

我怎样才能使用PHP制作一个2列25行的表格,列出数据库中25个具有最高$ sum值的书籍(按降序排列)?

提前致谢,

约翰

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

// We preform a bit of filtering

$entry = strip_tags($entry);
$entry = trim ($entry);
$entry = mysql_real_escape_string($entry);


$result = mysql_query("SHOW TABLES FROM bookfeather") 
or die(mysql_error()); 

$table_list = array();
while(list($table)= mysql_fetch_row($result))
{
  $sqlA = "SELECT COUNT(*) FROM `$table` WHERE `site` LIKE '$entry'";

  $resA = mysql_query($sqlA) or die("$sqlA:".mysql_error());
  list($isThere) = mysql_fetch_row($resA);
  $isThere = intval($isThere);
  if ($isThere)
  {
     $table_list[] = $table;
  }

}

//$r=mysql_query("SELECT * , votes_up - votes_down AS effective_vote FROM `$table[0]` ORDER BY effective_vote DESC");


if(mysql_num_rows($resA)>0){
foreach ($table_list as $table) { 
    $sql = "SELECT votes_up FROM `$table` WHERE `site` LIKE '$entry'"; 
    $sql1 = mysql_query($sql) or die("$sql:".mysql_error());
   while ($row = mysql_fetch_assoc($sql1)) {
       $votes[$table] = $row['votes_up'];
       $sum += $row['votes_up'];
       //echo $table . ': "' . $row['votes_up'] . " for $entry from $table\"<br />";
   } 

}
}
else{
print "<p class=\"topic2\">the book \"$entry\" has not been added to any category</p>\n";
}


//within your loop over the DB rows
//$votes[$table] = $row['votes_up'];

//afterwards

if($sum>0){



print "<table class=\"navbarb\">\n";
print "<tr>";
print "<td class='sitenameb'>".'<a type="amzn" category="books" class="links2b">'.$entry.'</a>'."</td>";
print "</tr>\n";
print "</table>\n";

//echo "<p class=\"topic3\">".'<a href="http://'.$entry.'" class="links3">'.$entry.'</a>'. "</p>\n";
echo "<p class=\"topic4\">". number_format($sum) . ' votes in total.'."</p>\n";

2 个答案:

答案 0 :(得分:1)

尝试这样的事情。所有这些都没有经过测试,所以请添加更改注释。我会和你合作以获得正确的代码。

// After getting your array of tables formated like 
$tableArray = array("`tableA`", "`tableB`", "`tableC`");

// create a table statement
$tableStatement = implode(", ", $tableArray);

// create a join statement
$joinStatement = "";
for ($i = 1; $i < count($tableArray); $i++) {
    if ($joinStatement != "")
        $joinStatement .= " AND "; 

    $joinStatement .= $tableArray[0] . ".site = " . $tableArray[$i] . ".site"
}

$firstTable = $tableArray[0];

$sql = "SELECT SUM(votes_up) FROM " . $tableStatement . " WHERE " . $joinStatement . " AND " . $firstTable . ".site LIKE '" . $entry . "' GROUP BY " . $firstTable . ".site ORDER BY SUM(votes_up) DESC";

编辑-------- 我现在意识到上面的查询将无法正常工作,因为votes_up将是不明确的。另外,因为您可能希望进行连接以获取仅在一个表中的记录。我认为这个概念是正确的方向,即使查询可能不完美。

你可以做点什么     $ selectStatement =“SUM(tableA。votes_up)+ SUM(tableB。votes_up)as total_votes_up”

答案 1 :(得分:1)

我最近做了类似的事情。在您的数据库中,您必须将每个字段重命名为相应的book name.php,如(TaleofTwoCities.php)。现在在您的页面上将显示投票结果,您需要包含一些将在每次加载时驱动数据库查询的php文件。我称之为“engine1.php”和“engine2.php”。这些将为您完成所有排序。

$query1 = mysql_fetch_row(mysql_query("SELECT url FROM pages ORDER BY counter DESC
LIMIT 0,1"));
$query2 = mysql_fetch_row(mysql_query("SELECT url FROM pages ORDER BY counter DESC
LIMIT 1,1"));
$query3 = mysql_fetch_row(mysql_query("SELECT url FROM pages ORDER BY counter DESC
LIMIT 2,1"));

依旧......然后..

$num1 = "$query1[0]";
$num2 = "$query2[0]";
$num3 = "$query3[0]";

该部分按照从最高到最低的投票数对您的列表进行排序,在您的情况下,url是书籍的名称(记住您希望它以.php结尾 - 你会在一秒钟内看到原因) ),并且反击是记录你的投票的领域。

制作你的第二个engine.php文件并添加如下内容:

$vquery1 = mysql_fetch_row(mysql_query("SELECT counter FROM pages WHERE 
url='book1.php'"));
$vquery2 = mysql_fetch_row(mysql_query("SELECT counter FROM pages WHERE 
url='book2.php'"));

$vnum1 = "$vquery1[0]";
$vnum2 = "$vquery2[0]";

等等......直到你和引擎1都达到25。

现在,在结果页面中,在身体开始处输入require_once(engine.php)和require_once(engine2.php)后,启动HTML表格。你只想要两列,所以它就像......

<table border=1 cellspacing=0 cellpadding=0>
<tr>
<?php include $num1; ?>
</tr>
<tr>
<?php include $num2; ?>
</tr>

等等......通过用“book1.php”命名你的字段并包含引擎,$ num1将根据从高到低的投票变为另一个.php文件。现在你所要做的就是为每本书制作小的php文件 - 没有标题或任何东西,因为你已经将它插入到html代码的中间了:

<td style="width:650px;"><center><img src="images/book1.jpg" alt="" border="none"
/></a></center></td>
<td style="width:150px;">Votes:&nbsp;<?php echo $vnum1;?></td>

你有它。一个代码,它将动态地为您提供从高到低的结果,具体取决于每本书的投票数。