【问题标题】:how to select all table in database如何选择数据库中的所有表
【发布时间】:2014-06-01 00:47:50
【问题描述】:

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

数据库:演示

表: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>
";

}

【问题讨论】:

  • 为什么不用一个表正确地重新设计您的数据库,并为您当前使用的数值增加一列作为表名的一部分
  • 不幸的是,无法重新设计数据库以找到解决方案,顺便说一下我可以得到答案,但它不完整
  • 那么我允许你用湿黑线鳕打败为你设计它的人,因为他们创造了一组疯狂的桌子,几乎无法使用
  • 我同意你做同样的事情
  • @user3509550,没必要打败老程序员。这是一个简单的修复。看我的回答。

标签: php mysql sql select pagination


【解决方案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 倍的结果。

【讨论】:

    【解决方案2】:

    您有 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 查找它们。享受吧。

    【讨论】:

      【解决方案3】:

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

      您使用的脚本——我可能是错的,因为我不确定你使用的是哪种语言——似乎没有任何语义用于多线程。 (如果您使用 bash 或类似的 UNIX shell,请查找“fork”的文档)。

      其次,如果出于某种原因不能选择并行调用,请考虑以 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 引擎本身来执行并行执行和线程。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多