我的db表看起来像那样
第一张桌子
第二张表 - lastsrvc(上次服务信息)。 id列-uniques每个问题的autincremented id。 'cid'专栏 - 公司的ID。它是2个表之间的链接列:main和lastsrvc。
现在,我想要做的是,让我们说,计算公司1的所有问题。我的代码在1个查询之前发送并获取主表的所有行。然后为每个公司的行发送第二个查询。如果将来会有10 000家公司,我认为它会加载服务器。有没有办法发送1个查询而不是为每个公司发送查询(在while内)?是否有可能在使用COUNT之前,而不是在第二次查询时? Thx提前。
我的代码看起来像那样
<?php
$query=$db->query("SELECT * FROM main");
while($row=$query->fetch_object())
{?>
<tr>
<td><?=$row->id;?></td>
<td><?=$row->company;?></td>
<td><?=$row->address;?></td>
<td><?=$row->contact_name;?></td>
<td><?=$row->contact_phone;?></td>
<td><?php
if ($row->warr)
{
echo 'Var,'.$row->warr_year.' il';
}
else {
echo 'Yoxdur';
}
?></td>
<td>
<?php
if ($query2=$db->query("SELECT * FROM lastsrvc WHERE cid='$row->id'"))
echo $query2->num_rows;
?>
</td>
</tr>
<?php } ?>
答案 0 :(得分:2)
做一个JOIN
SELECT main.etc, main.etc ..., COUNT(*) AS total
FROM main
LEFT JOIN lastsrvc ON main.id=lastsrvc.cid
GROUP BY main.id;
当数据变大时,使用分页来分割结果。
随着较大的HTML返回,浏览器也无法接受
(想象一下,超过10Mb的页面很难在浏览器中正确加载)
您还可以将结果存储到缓存中,例如存储到memcache中 缓存的好处是避免过度查询数据库
答案 1 :(得分:2)
将此作为您的顶级(且唯一)查询:
SELECT main.id, company, address, contact_name, contact_phone, COUNT(cid) as cnt
FROM main
LEFT JOIN lastsrvc ON main.id = lastsrvc.cid
GROUP BY main.id
使用连接的单个查询几乎总是比运行1 + n查询更有效。你像往常一样回应那个'cnt'字段:
<td><?php echo $row->cnt ?></td>
答案 2 :(得分:0)
在添加到其他答案中,您还可以在您加入的列上设置索引并进行过滤,以便以后加快查询速度。