很简单,这样的查询/语句是低效还是坏?
<?
$strSql="SELECT * FROM clients, projects
WHERE clients.clientID = $intClientId
AND projects.clientID=$intClientId LIMIT 1";
$objResult=mysql_query($strSql);
if(mysql_num_rows($objResult)==0) {
echo("No data"); }
while ($arrRow=mysql_fetch_array($objResult))
{
?>
<h1>Sub Project(s) for: <span><?=$arrRow[clientName]?></span></h1>
<?
} ?>
答案 0 :(得分:2)
一般情况下,除非绝对必要,否则应避免使用SELECT *
并仅选择所需的字段。这是否有效取决于表的索引方式。在这种情况下,我假设clientID
是clients
表的主键。如果clientID
表中的projects
上有索引,则此查询应该非常快。
答案 1 :(得分:2)
这里有几件事情:
SELECT *
。这可能是一个效率问题。在某些情况下,如果您的应用程序对表中的列进行假设,然后表中的表发生更改,它也会破坏应用程序。LIMIT 1
,但随后循环显示结果。这没有意义,因为LIMIT 1
意味着您只会获得一行结果,无论您的查询匹配多少行。答案 2 :(得分:1)
我还想补充一点建议:从现在开始,尽量不要使用php短标签(使用<?php echo
代替<?=
)。从PHP6开始,它将不受支持,并且可能在将来为您创建代码错误和其他困难。
答案 3 :(得分:0)
在编写时,或者我应该说开发新功能时,应始终在查询时调试并运行性能配置文件,以确保您使用正确的索引。请始终在查询中使用EXPLAIN(如果您的具体信息,请使用EXPLAIN EXTENDED)来确定其效果。
EXPLAIN SELECT * FROM clients, projects WHERE clients.clientID = 1 AND projects.clientID = 1
我还注意到你做了一个while()循环,如果你只获取一行,这是不必要的。
答案 4 :(得分:-1)
我更喜欢编写projects.clientID=clients.clientID
,以便更容易看到表格的连接方式。
我将避免的另一件事(主要是为了清晰)是while
循环。由于您需要一条记录,因此无需遍历结果集。
最后,使用短标签不是一个好主意。