Foreach还是Inner加入? - 这是PHP的问题

时间:2010-12-15 03:29:49

标签: php join foreach

我有2张桌子。一个(artWork)包含我想要提取的所有数据,包括2个id的列。另一个(sharedWork)具有相同的2个id cols,它们也在第一个 - 但没有我想要回显的基本数据。目标:使用两个表中的id来过滤掉第一行(artWork)中的行。请参阅下面的代码,我尝试了什么不起作用

我还试图找出一个可以实现同样目标的内连接。也没有运气。想知道哪种方法最好,怎么做。

感谢 阿伦

//////// Get id's first ///////////
$QUERY0="SELECT * FROM artWork WHERE user_id = '$user_id' ";
    $res0 = mysql_query($QUERY0);
 $num0 = mysql_num_rows($res0);
 if($num0>0){
 while($row = mysql_fetch_array($res0)){ 
   $art_id0 = $row['art_id'];
         }
}
$QUERY1="SELECT * FROM shareWork WHERE user_id = '$user_id' ";
    $res1 = mysql_query($QUERY1);
 $num1 = mysql_num_rows($res1);
 if($num1>0){
 while($row = mysql_fetch_array($res1)){ 
   $art_id = $row['art_id'];
 }
}
$art_id2 = array_merge($art_id0, $art_id1);

foreach ($art_id2 as $art_id3){ $QUERY="SELECT * FROM artWork WHERE art_id = '$art_id3' "; // echo "id..".$art_id0; $res = mysql_query($QUERY); $num = mysql_num_rows($res); if($num>0){

while($row = mysql_fetch_array($res)){ $art_title = $row['art_title']; $art_id = $row['art_id']; etc................and so on .........to....

</tr>"; } }

}

1 个答案:

答案 0 :(得分:7)

除非绝对必须,否则不要在循环内查询数据库。

每次查询数据库时,您都在使用磁盘I / O来读取数据库并返回记录。磁盘I / O是计算机上的最慢读取,并且将成为您应用程序的大量瓶颈。

如果您预先运行较大的查询,或者至少在循环之外运行,则会减少您的磁盘访问次数,从而提高性能。较大查询的结果将保存在内存中,这比从磁盘读取要快得多。


现在,在发出警告的情况下,让我们解决您的实际问题:

您似乎正在尝试从用户是主要艺术家的artWork抓取记录,或者用户是处理群组项目的几位艺术家之一。 artWork似乎拥有项目中主要艺术家的ID,而shareWork可能是某种多对多查找表,它将用户ID与他们所属的所有艺术项目相关联。 / p>

我应该问的第一件事是你是否需要第一次查询到artWork,或者主要艺术家是否应该在shareWork中拥有该art_id的记录,因为项目。

如果您不需要第一次查找,那么查询就变得非常简单了:只需从art_id表中获取所有用户shareWork并使用它来查找他或她的记录主artWork表:

SELECT artWork.*
FROM artWork
WHERE art_id IN
  (SELECT art_id
   FROM shareWork
   WHERE user_id = $user)

如果需要查看两个表,那么您只需在上面的查询中添加一个检查,以便在artWork表中检查该用户:

SELECT artWork.*
FROM artWork
WHERE 
  user_id = $user
OR art_id IN
  (SELECT art_id
   FROM shareWork
   WHERE user_id = $user)

这样可以在一个查询中获取所有artWork个记录,而不是......好吧,很多的查询,您可以在mysql_fetch_array循环查看一个查询的结果,并用它完成。