我有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>"; } }
}
答案 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
循环查看一个查询的结果,并用它完成。