foreach循环中嵌套while循环的结果集结构

时间:2014-12-04 20:02:33

标签: php mysql foreach while-loop sphinx

我正在使用Sphinx搜索来搜索我网站上的项目。我是否正在使用foreach来查找搜索来自哪里的索引? Foreach循环将迭代搜索词匹配的所有项目,并找出索引。

数据库中的所有项目都有user_id从用户表中引用用户。所以,我要输出的内容是显示少量项目(搜索)并将其放在该用户下。如果搜索' Book&#39 ;,然后输出像这样

Alex       //Book1,Book2,Book3 all of them has user_id of 2 which refers to Alex

Book1
Book2
Book3

Jordan     //Book11,Book12,Book18 all of them has user_id of 5 which refers to Joradn

Book11
Book12
Book18

and so on.

以下是

的代码
foreach ( $res["matches"] as $doc => $docinfo ) {
    switch($docinfo['attrs']['table_id']) {
       case 1:                         //if search come from index 1

        $res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
            if ($res_db === false) {
                    echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
            } else {
            $row = mysqli_fetch_assoc($res_db);
                            $connect4=mysqli_connect('localhost', 'root', '','user');
                  $sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
                  BY id DESC";
                  $query2=mysqli_query($connect4,$sql2);
                  while($row2 = mysqli_fetch_assoc($query2)){    //line X
                  $userx=$row2['id'];
                  $image=$row2['img'];
                  $busi_title=$row2['busi_title'];

                  $page_owner.="<img src='../../account/$userx/$image' width='140'
                  height='140'><b>$busi_title</b><hr>";

                    $res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
                    lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
                    $alu="";
                    while($row3 = mysqli_fetch_assoc($res_db2)){
                            $alu.=

                            '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
                            . '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'

                            . '<br/> '.$row3['detail'].'<br><br><br><br>' ;
                      }
                    $all.="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
                    }
    } 

但是上面的代码给了我这样的结果

Alex
Book1

Alex
Book2

Alex
Book3

Jordan
Book11

Jordan
Book12

Jordan
Book18

and so on.

我需要做哪些修改才能使我的代码像预期的那样工作。我已尽力找到解决方案,但没有帮助。所以,只是建立了一个SO帐户来发布问题。

请帮助,如果可以的话。那真是太棒了。

提前致谢

谢谢Ryan的回复。我们几乎在那里

另外1个修复,然后我们就完成了。现在我得到的是

Problem 
Result is almost the way,I was looking for except for the first one.This is what I'm getting

Alex
Book1

Jordan
Book11
Book12
Book18

Alex
Book2
Book3

如果我可以在回显order by user_id之前执行临时$all,则可能会修复此错误。

因为$all打印user及其corresponding item在数据库中的排序方式

请注意,我使用了第二种方式,你展示了。第一种方式不起作用。

我已经找到问题的第二部分。要达到预期效果,我需要这样做

$cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC,user_id ASC');

此行代码首先输出最相关的搜索结果,然后按user_id Ascending进行分类。

Special Thanks to Ryan

1 个答案:

答案 0 :(得分:2)

所以我对重复用户的起源有点困惑,因为我不确切知道你要查询的内容,但我知道可能导致它的原因。

首先,如果内循环是问题,它是一个简单的修复。只显示&#39; user_id&#39;在第一次循环。

                $alu="";
                $firstLoop = true;
                while($row3 = mysqli_fetch_assoc($res_db2)){
                        if($firstLoop){
                             $alu.= '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
                             $firstLoop = false;
                         }
                       $alu.= '<a href="../../'.$row3['user_id'].'/menu_item2.php">' .  row3['title'] . '<a>'

                        . '<br/> '.$row3['detail'].'<br><br><br><br>' ;
                  }

或者,正如Sean建议的那样,它可能会发生在外部循环中。在这种情况下,我们可以跟踪以前的用户,以确定是否应该设置$ userx并使用$ page_owner。

     $prevUsr = '';
     foreach ( $res["matches"] as $doc => $docinfo ) {
switch($docinfo['attrs']['table_id']) {
   case 1:                         //if search come from index 1

    $res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
        if ($res_db === false) {
                echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
        } else {
        $row = mysqli_fetch_assoc($res_db);
                        $connect4=mysqli_connect('localhost', 'root', '','user');
              $sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
              BY id DESC";
              $query2=mysqli_query($connect4,$sql2);
              while($row2 = mysqli_fetch_assoc($query2)){
              $userx=$row2['id'];
              $image=$row2['img'];
              $busi_title=$row2['busi_title'];

              $page_owner.="";

              // only set the page owner if the user id is different
              if($prevUsr != $userx){
                   $page_owner.="<img src='../../account/$userx/$image' width='140'
                   height='140'><b>$busi_title</b><hr>";

                   $prevUsr = $userx;
              }

                $res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
                lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
                $alu="";
                while($row3 = mysqli_fetch_assoc($res_db2)){
                        $alu.=

                        '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
                        . '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'

                        . '<br/> '.$row3['detail'].'<br><br><br><br>' ;
                  }
                $all="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
                }
} 

我希望其中一个可以帮助你。

快乐的编码。 莱恩