2009-08-26 5 views
0

У меня есть база данных 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» он имеет из всех таблиц. Затем он перечисляет 25 лучших значений для «сайта» (в зависимости от общего количества «голосов_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>"; 


?> 
+0

Ух ... как вы собираетесь определять «хронологию», когда у вас нет даты какого-либо вида (что я вижу ... я слепой?) – kolosy

+0

Вы правы ... мне нужно добавить штамп даты как-то для «сайта»? В другом запросе я использую INFORMATION_SCHEMA.TABLES и CREATE_TIME для отображения таблиц, созданных в обратном хронологическом порядке ... есть ли способ использовать это здесь? – John

+0

Нет, строки таблицы не записываются в INFORMATION_SCHEMA. –

ответ

1

Как сказано в комментарии, вы должны добавить столбец, который будет хранить время, когда была создана строка. Этот столбец может быть типа INT, если вы собираетесь хранить временные метки UNIX или DATETIME, если хотите использовать строки даты. Кроме того, если вы не хотите этого делать, вы можете использовать ORDER BY id DESC, потому что автоинкрементные столбцы чаще всего соответствуют хронологическому порядку, но это не стабильное решение, потому что, когда значение AUTO_INCREMENT иссякает из диапазона INT, он начинает использовать неиспользуемые значения (например, из удаленных строк).

Смежные вопросы