如何选择数据库中的所有表

时间:2014-04-16 22:37:48

标签: php mysql sql select pagination

我在数据库中有两百个表,想要在我选择使用分页时搜索所有这些表不幸的是,遇到错误

  

数据库:演示

     

表:sura1,sura2,...,sura200

代码:

 $i=0;
 while($i<=200){

 $constructs ="SELECT * FROM sura$i WHERE message  like '%$keywords%'";

 $run = mysql_query($constructs);

  $foundnum = mysql_num_rows($run);
 $i++;
    }   

if ($foundnum==0)
echo "Sorry";

else
{ 

echo "$foundnum results found !<p>";

$per_page = 5;
if(isset($_GET['start'])){$start = $_GET['start'];}else{$start=0;}

$max_pages = ceil($foundnum / $per_page);
if(!$start)
$start=0; 

 $i=0;
 while($i<=200){
 $getquery = mysql_query("SELECT * FROM sura$i WHERE LIMIT $start, $per_page");
 $i++;
 }
while($runrows = mysql_fetch_assoc($getquery))
{
$title = $runrows ['title'];
$desc = $runrows ['name'];
$url = $runrows ['id'];

echo "
<a href='$url'><b>$title</b></a><br>
$desc<br>
<a href='$url'>$url</a><p>
";

}

3 个答案:

答案 0 :(得分:1)

如果您真的无法避免使用大量的表和查询,那么您应该按照自己的方式进行修改。

在循环之前初始化计数器并在循环中增加它:

$foundnum = 0;
while($i<=200){

  $constructs ="SELECT * FROM sura$i WHERE message  like '%$keywords%'";

  $run = mysql_query($constructs);

  $foundnum += mysql_num_rows($run);
  $i++;
}

但是对于单个搜索结果页面的400个查询是一个非常糟糕的主意,更不用说您无法订购页面并且您的分页不会起作用,因为您将在一个页面上获得所需结果数量的200倍。

答案 1 :(得分:0)

你有200个表都是相同的结构,对吗?所以只需将它们变成一个表:

create table all_suras like sura1;
alter table all_suras add sura_number int;
insert into all_suras select *, 1 from sura1;
insert into all_suras select *, 2 from sura2;
insert into all_suras select *, 3 from sura3;
...
insert into all_suras select *, 200 from sura200;

现在你把它们都放在一张桌子里。你可以通过新的字段sura_number查找它们。享受。

答案 2 :(得分:0)

所以有几条评论:
首先,您通常需要一个运行多个线程的进程。我怀疑分区设计的目的只是保持每个表的小,以便您可以从并行性中受益。要正确利用这一点,您需要并行调用查询,这意味着拥有多个线程。

您正在使用的脚本 - 我可能错了,因为我不确定您使用的是哪种语言 - 似乎没有任何语法适用于多线程。 (如果您使用的是bash或类似的UNIX shell,那么请查找&#39; fork&#39;)的文档。

其次,如果由于某种原因,并行调用不是一个选项,请考虑按如下方式调用10个表中的查询:

$i = 1;
$k = 1;
$foundnum = 0;
while($i<=20){
   $j=1;
   while($j<=10) {
      $sql1 = "SELECT * FROM sura$k where message like '%keywords%'";
      $k++;
      $sql2 = "SELECT * FROM sura$k where message like '%keywords%'";
      $k++;
        ...
      $k++;
      $sql10 = "SELECT * FROM sura$k where message like '%keywords%';
      sql_chunk = "$sql1 UNION ALL $sql2 UNION ALL ... $sql9 UNION ALL $sql10";
      $run = mysql_query($sql_chunk);
      $foundnum += mysql_num_rows($run);
      $j++;
   }
   // add logic to control pagination display here...
   $i++;
}

您可能需要自己控制分页逻辑,但基本思路如上所述。请注意,您在这里包含两个想法:第一,jeroen提出的想法,第二,使用UNION操作执行并行的想法。在这种情况下,我们使用SQL引擎本身来执行并行执行和线程。

祝你好运!