我有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);Run Code Online (Sandbox Code Playgroud)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>"; } }
}
除非绝对必须,否则不要在循环内查询数据库.
每次查询数据库时,都使用磁盘I/O来读取数据库并返回记录.磁盘I/O是计算机上读取速度最慢的,对于您的应用程序来说将是一个巨大的瓶颈.
如果您预先运行较大的查询,或者至少在循环之外运行,那么您将不太经常地访问磁盘,从而提高性能.较大查询的结果将保存在内存中,这比从磁盘读取要快得多.
现在,在发出警告的情况下,让我们解决您的实际问题:
您似乎正在尝试从artWork
用户是主要艺术家的位置获取记录,或者用户是处理群组项目的几位艺术家之一.artWork
似乎在项目中拥有主要艺术家的身份,而shareWork
可能是某种多对多的查找表,它将用户ID与他们所属的所有艺术项目相关联.
我要问的第一件事是你是否需要第一个查询,artWork
或者主要艺术家是否应该拥有该art_id的记录,因为他们完全参与shareWork
了该项目.
如果您不需要第一次查找,则查询变得非常简单:只需art_id
从shareWork
表中获取所有用户并使用该查询在主artWork
表中查找他或她的记录:
SELECT artWork.*
FROM artWork
WHERE art_id IN
(SELECT art_id
FROM shareWork
WHERE user_id = $user)
Run Code Online (Sandbox Code Playgroud)
如果您确实需要查看这两个表,那么您只需在上面的查询中添加一个检查,以检查artWork
表中的该用户:
SELECT artWork.*
FROM artWork
WHERE
user_id = $user
OR art_id IN
(SELECT art_id
FROM shareWork
WHERE user_id = $user)
Run Code Online (Sandbox Code Playgroud)
这将artWork
在单个查询中获取所有记录,而不是..好吧,很多查询,您可以mysql_fetch_array
对该一个查询的结果进行循环并完成它.