我有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>";
}
}
Run Code Online (Sandbox Code Playgroud)
}
除非绝对必须,否则不要在循环内查询数据库.
每次查询数据库时,都使用磁盘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对该一个查询的结果进行循环并完成它.