【问题标题】:Foreach or Inner join? -- that is the PHP questionForeach 还是 Inner 连接? -- 那是 PHP 的问题
【发布时间】:2011-05-25 16:33:46
【问题描述】:

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

我还试图找出一个可以实现相同效果的内部连接。那里也没有运气。想知道哪种方法是最好的方法以及如何去做。

谢谢 艾伦

//////// 获取id的第一个////////// $QUERY0="SELECT * FROM artWork WHERE user_id = '$user_id' "; $res0 = mysql_query($QUERY0); $num0 = mysql_num_rows($res0); 如果($num0>0){ 而($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); 如果($num1>0){ 而($row = mysql_fetch_array($res1)){ $art_id = $row['art_id']; } } $art_id2 = array_merge($art_id0, $art_id1);

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

while($row = mysql_fetch_array($res)){ $art_title = $row['art_title']; $art_id = $row['art_id']; 等等……等等 ......到......

</tr>"; } }

}

【问题讨论】:

    标签: php join foreach


    【解决方案1】:

    除非万不得已,否则不要在循环中查询数据库。

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

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


    现在,摆脱警告,让我们解决您的实际问题:

    您似乎正试图从artWork 获取记录,其中用户是主要艺术家,或者用户是参与小组项目的几位艺术家之一。 artWork 似乎持有项目中主要艺术家的 ID,而 shareWork 可能是某种多对多查找表,它将用户 ID 与他们参与的所有艺术项目相关联。

    我要问的第一件事是,您是否甚至需要对artWork 进行第一次查询,或者主要艺术家是否应该在shareWork 中拥有该art_id 的记录,因为您完全参与过该项目。

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

    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 循环查询并完成。

    【讨论】:

    • 第一次拍摄。谢谢你。是的,我确实需要从子表 shareWork 中提取共享 ID。我已经制定了一个 foreach 循环,该循环对从 2 个单独的查询中提取的数组进行操作来完成这项工作。但这禁用了我的排序功能。你是我知道可以完成但无法自己想出的内部连接。
    • @artworthy:太棒了。如果我的回答对您有用,请考虑将其标记为已接受(单击我的回答左侧的绿色复选标记)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多