我正在尝试创建一个基于从MySQL数据库的列中使用通配符选择的结果的列表。我能够做到这一点,但是它看起来很慢,而且可能是错误的方式。下面是我正在修改的代码
$optarr = array("leather", "cruise", "tint", "sunroof", "moonroof", "navigation", "antilock");
foreach ($optarr as $i) {
$refquery = "SELECT stock, COUNT(stock) FROM vehicle_list AND options LIKE '%$i%'";
$refresult = mysql_query($refquery) or die(mysql_error());
$row = mysql_fetch_array($refresult);
if ($row['COUNT(stock)'] != '0') {
echo "".ucfirst($i)." (".$row['COUNT(stock)'].")<br />";
}
}这将输出以下内容
Leather(234)
Cruise(343)
Tint(231)
Sunroof(343)
.....这个列表最终将有大约20-30个不同的过滤器选项,目前在4-5个选项中,我可以看到很大的延迟。我做错了什么,只是不知道是什么。也许是整个方法?
数据库中的options列是由@ symbols分隔的整个文本块,因此我使用Like通配符来提取车辆选项。
谢谢!
发布于 2013-04-03 01:26:31
在foreach循环之前进行数据库调用。这将在每个循环上调用数据库,并且将如预期的那样缓慢。
发布于 2013-04-03 01:30:13
从规范化和优化的角度来看,您应该将您的选项放在一个单独的表中,然后使用一个表将vehicle_list表链接到您的选项。
这将允许您使用join和group by来仅使用一个查询来获得所需的结果,而不是使用双边的like (即使在使用索引时,这也不是一个好主意)。
http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html
发布于 2013-04-03 01:30:29
您必须连接表
$optarr = array("leather", "cruise", "tint", "sunroof", "moonroof", "navigation", "antilock");
foreach ($optarr as $i) {
$refquery = "SELECT stock, COUNT(stock) FROM vehicle_list
LEFT JOIN options ON vehicle_list.stock=options.stock LIKE '%$i%'";
$refresult = mysql_query($refquery) or die(mysql_error());
$row = mysql_fetch_array($refresult);
if ($row['COUNT(stock)'] != '0') {
echo "".ucfirst($i)." (".$row['COUNT(stock)'].")<br />";
}https://stackoverflow.com/questions/15770336
复制相似问题