$query = "select DISTINCT user_info.`uid`, company_info.`uid`, user_info.`fname`, user_info.`lname`, user_info.`profile_pic`, company_info.`name` FROM user_info, company_info where fname like '%$q%' or lname like '%$q%' AND company_info.`uid` = user_info.`uid` LIMIT 5";
while($row = mysql_fetch_assoc(mysql_query($query))){
outputUserImage($row["profile_pic"]);
outputUserFname($row["fname"], $row["uid"]);
outputUserLname($row["lname"]);
outputUserCompany($row["name"]);
}
此查询有效,但是返回的结果太多(重复)并且执行速度很慢。有人能告诉我这似乎是什么问题吗?
答案 0 :(得分:7)
我看到了问题。你在循环中调用mysql_query()
,一遍又一遍!
// Don't do this!
while($row = mysql_fetch_assoc(mysql_query($query))){
//-----------------------------^^^^^^^^^^^^^^^^^
相反,首先在循环外执行查询:
// Do the query first
$result = mysql_query($query);
// Check that it succeeded
if ($result) {
// Then fetch rows
while($row = mysql_fetch_assoc($result)){
// Rest of loop...
}
}
// problem with query...
else {
echo mysql_error();
}
您可能正在运行PHP的最大执行时间,因为您的查询一遍又一遍地返回,否则将是无限循环。始终在循环外调用mysql_query()
,并在获取结果之前验证它是否已成功完成。
答案 1 :(得分:0)
这是因为你的SQL查询。你正在做一个笛卡尔连接,它只是返回每个表乘以其他行数....
select DISTINCT user_info.`uid`, company_info.`uid`, user_info.`fname`, user_info.`lname`, user_info.`profile_pic`, company_info.`name`
FROM user_info, company_info
where fname like '%$q%'
or lname like '%$q%'
AND company_info.`uid` = user_info.`uid`
LIMIT 5
你想要这个,这可能会帮助你摆脱不同的。注意or语句周围的括号。
select DISTINCT user_info.`uid`, company_info.`uid`, user_info.`fname`, user_info.`lname`, user_info.`profile_pic`, company_info.`name`
FROM user_info, company_info
where company_info.`uid` = user_info.`uid`
and ( fname like '%$q%'
or lname like '%$q%' )
LIMIT 5
答案 2 :(得分:-1)
我认为这与WHERE子句中的操作顺序有关。 AND先于OR。尝试将OR'd语句包装在括号中,如下所示:
where (fname like '%$q%' or lname like '%$q%') AND company_info.`uid` = user_info.`uid` LIMIT 5";