Php 由于while循环的数量,数据库查询时间较长

Php 由于while循环的数量,数据库查询时间较长,php,mysql,loops,Php,Mysql,Loops,我使用下面的代码从我的数据库中获取数据并将其显示在我的网站上。我注意到,因为我使用了太多的while循环,我的网站加载速度非常慢。我知道我的数据库建设得很糟糕,但那是我目前能做的最好的了 我有一个名为properties的数据库,其中包含10多列: id、头衔、国家、地点2、地点3、地点4、地点5、地点6等 我想做的是:例如,当我浏览表country='spain'时,它包含表location2example ibiza中的位置,接下来我浏览'location2='ibiza',`它包含loca

我使用下面的代码从我的数据库中获取数据并将其显示在我的网站上。我注意到,因为我使用了太多的while循环,我的网站加载速度非常慢。我知道我的数据库建设得很糟糕,但那是我目前能做的最好的了

我有一个名为properties的数据库,其中包含10多列: id、头衔、国家、地点2、地点3、地点4、地点5、地点6等

我想做的是:例如,当我浏览表country='spain'时,它包含表location2example ibiza中的位置,接下来我浏览'location2='ibiza',`它包含location3中的位置,依此类推

有可能只用一段时间就可以做到这一点吗


我不确定你是否关心这件事,但一个工会可能会加快速度:

$select_loc = "
    SELECT `location2` as `location`, '2' as `number`
      FROM `properties`
     WHERE ".$between_price." `country` = '".ucfirst($location)."'
     UNION
    SELECT `location3` as `location`, '3' as `number`
      FROM `properties`
     WHERE ".$between_price." `location2` = '".ucfirst($location)."'
";

// debug SQL
echo $select_loc.'<br>';

$locs = mysql_query($select_loc) or die(mysql_error());  

while($loc = mysql_fetch_array( $locs )) {
    echo $loc['number'].' : '.$locl['location'].'<br>';
}
这就是查询,我如何添加索引来加速它

这是在phpmyadmin中执行的实际查询

显示行0-6 7总计,查询耗时6.4767秒

这是相同的查询,但我使用UNION ALL显示所有结果:

显示行0-29 23074总计,查询耗时4.0590秒


我迫切需要一些东西来加速这个查询

对查询使用联接。脚本已准备好进行注入。请注意这一点。使用PDO。此外,构建URI的方式也不安全。太多的地方可以操纵了。娜娜,我在加入方面遇到了麻烦,你能解释一下怎么做吗?那里也有很多可爱的货运邪教节目$var是毫无意义的…代码似乎不起作用,我正在试图找到错误。谢谢@Kev请查看我的带有调试SQL注释的更新。如果您可以发布echo$select_loc的输出。;好的,我将代码从$locl['location']更正为$loc['location'],但是当我回显结果时,它会显示locations2和locations3中的所有位置,在这里它应该只显示locations2,如果我单击其中一个位置,它会显示locations3中的位置,依此类推,直到locations6。你能帮个忙吗?@Kev是的,我只教过如何结合2和3,其余的你都明白了吗?我认为缓慢的主要原因之一将是独特条款。我建议您使用just union尝试查询我的最新更新,而不使用all。另外,20k行不是很多行,也许您可以在location2、location3等列上添加一个索引以加快速度。@MoneyZeus我找到了代码的其余部分,它可以正常工作,但现在,在删除DISTINCT之后,我意识到查询需要很长时间,因为如果没有DISTINCT,它会显示相同位置的50k倍,因为数据库中的每一行都包含这些位置中的一个,这就是为什么加载需要很长时间。我是否可以使用另一个选项来代替DISTINCT,以达到相同的效果?
$select_loc = "
    SELECT `location2` as `location`, '2' as `number`
      FROM `properties`
     WHERE ".$between_price." `country` = '".ucfirst($location)."'
     UNION
    SELECT `location3` as `location`, '3' as `number`
      FROM `properties`
     WHERE ".$between_price." `location2` = '".ucfirst($location)."'
";

// debug SQL
echo $select_loc.'<br>';

$locs = mysql_query($select_loc) or die(mysql_error());  

while($loc = mysql_fetch_array( $locs )) {
    echo $loc['number'].' : '.$locl['location'].'<br>';
}
SELECT `location2` as `location`, '2' as `number` FROM `properties` WHERE `price_from` BETWEEN 0 AND 999999 AND `country` = 'spain' union SELECT `location3` as `location`, '3' as `number` FROM `properties` WHERE `price_from` BETWEEN 0 AND 999999 AND `location2` = 'spain' union SELECT `location4` as `location`, '4' as `number` FROM `properties` WHERE `price_from` BETWEEN 0 AND 999999 AND `location3` = 'spain' union SELECT `location5` as `location`, '5' as `number` FROM `properties` WHERE `price_from` BETWEEN 0 AND 999999 AND `location4` = 'spain' union SELECT `location6` as `location`, '6' as `number` FROM `properties` WHERE `price_from` BETWEEN 0 AND 999999 AND `location5` = 'spain'