我在数据库中有两百个表,想要在我选择使用分页时搜索所有这些表不幸的是,遇到错误
数据库:演示
表: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>
";
}
答案 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引擎本身来执行并行执行和线程。