Получение значений из нескольких таблиц в базе данных MySQL - PullRequest
2 голосов
/ 06 августа 2009

У меня есть база данных MySQL под названием «bookfeather» с несколькими таблицами, которые содержат списки книг. Под каждой таблицей у каждой книги есть определенное количество голосов. Приведенный ниже код PHP позволяет пользователю вводить название книги ($ entry), а затем возвращает общее количество голосов, которое книга получила во всех таблицах ($ sum).

Как я могу использовать PHP для создания таблицы из 25 столбцов с двумя столбцами, в которой перечислены 25 книг в базе данных с наибольшим значением для $ sum (в порядке убывания)?

Заранее спасибо,

John

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 ]

1 голос
/ 11 ноября 2011

Я недавно сделал что-то подобное. В вашей базе данных вам нужно будет переименовать каждое поле в соответствующую книгу 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]";

и так далее ... Пока вы не получите 25 для этого и двигателя 1.

Теперь, на странице результатов, после того, как вы добавили 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>

И вот оно у вас есть. Код, который будет динамически давать вам результаты от высокого к низкому в зависимости от количества голосов, которые имеет каждая книга.

1 голос
/ 06 августа 2009

Попробуйте что-нибудь подобное. Все это не было проверено, поэтому, пожалуйста, добавьте комментарии для изменений. Я буду работать с вами, чтобы получить правильный код.

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

Редактировать -------- Теперь я понимаю, что приведенный выше запрос не будет работать идеально, потому что voice_up будет неоднозначным. Кроме того, потому что вы, вероятно, хотите делать объединения, которые собирают записи, которые находятся только в одной таблице. Я думаю, что концепция - правильное направление, даже если запрос не идеален.

Вы можете сделать что-то вроде $ selectStatement = "SUM (tableA .votes_up) + SUM (tableB .votes_up) как total_votes_up"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...