按逆时间顺序从多个表中打印出唯一值

时间:2009-08-26 04:26:52

标签: php mysql

我有一个包含多个表的MySQL数据库,每个表都具有相同的结构。结构是:

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)

下面的PHP代码打印出所有表中的每个唯一“站点”,并将所有表中的“votes_up”相加。然后它按降序列出“site”的前25个值(基于总“votes_up”)。

这段代码效果很好,但我想基于反向时间顺序的创建时间做同样的事情。我该怎么做?

提前致谢,

约翰

<?

mysql_connect("mysqlv10", "username", "password") or die(mysql_error());
mysql_select_db("bookfeather") 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);

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

// 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>";


?>

1 个答案:

答案 0 :(得分:1)

如评论中所述,您必须添加一个列,该列将存储创建行的时间。如果要存储UNIX时间戳,则此列可以是INT类型;如果要使用日期字符串,则此列可以是DATETIME。此外,如果您不想这样做,可以使用ORDER BY id DESC,因为自动增量列通常对应于时间顺序,但这不是一个稳定的解决方案,因为当AUTO_INCREMENT值超出INT数据类型的范围,它开始使用未使用的值(例如,来自已删除的行)。