Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL嵌套表选择-如果外部表与内部表不匹配,则不显示_Mysql_Select - Fatal编程技术网

MySQL嵌套表选择-如果外部表与内部表不匹配,则不显示

MySQL嵌套表选择-如果外部表与内部表不匹配,则不显示,mysql,select,Mysql,Select,我拉一个目录的主列表并循环,然后嵌套在循环中,我拉一组与每个目录匹配的注释 在下面的示例中,如何不显示dir3和dir4清单?这些代表类别的标识,如果结果为空,我不希望这些标识出现。我读了一些关于内部连接的文章,但它似乎不符合这个需要,或者至少我不理解它 为了简化文章,我删除了很多html表和结构。这个想法是,外部循环运行所有目录,但我不能真正检查我所知道的内部循环,看它是否应该被列出。我将通过非常有用的海报阅读下面发布的左连接选项 $sql_dir="SELECT dirid FROM lit

我拉一个目录的主列表并循环,然后嵌套在循环中,我拉一组与每个目录匹配的注释

在下面的示例中,如何不显示dir3和dir4清单?这些代表类别的标识,如果结果为空,我不希望这些标识出现。我读了一些关于内部连接的文章,但它似乎不符合这个需要,或者至少我不理解它

为了简化文章,我删除了很多html表和结构。这个想法是,外部循环运行所有目录,但我不能真正检查我所知道的内部循环,看它是否应该被列出。我将通过非常有用的海报阅读下面发布的左连接选项

$sql_dir="SELECT dirid FROM lit_directories";
$result_dir=mysql_query($sql_dir);
   while ($row_dir=mysql_fetch_assoc($result_dir)) {
edit here-->  echo $row_dir['dirid'];

   $sql_notes="SELECT notes, dirid FROM lit_notes WHERE dirid='".$row_dir['dirid']."'";
   $result_notes=mysql_query($sql_notes);
      while ($row_notes=mysql_fetch_assoc($result_notes)) {
         echo $row_notes['notes'];
      }
   }

  dirid   notes
-----------------------
| dir 1 | notes 1
|       | notes 2
|       | notes 3
-----------------------
| dir 2 | notes 1
|       | notes 2
-----------------------
| dir 3 |               <---- I don't want these last 2 dir lists to show
|       |                     since they are empty
-----------------------
| dir 4 |               <---- 
|       |                     
-----------------------
试试这个:

$sql_dir="SELECT l.dirid, notes FROM lit_directories l LEFT JOIN lit_notes n  ON n.dirid = l.dirid WHERE n.notes IS NOT NULL";
$result_dir=mysql_query($sql_dir);
while ($row_dir=mysql_fetch_assoc($result_dir)) {
      echo $row_notes['notes'];
}  
我会推荐你的建议。另一种方法是,如果找不到注释,可以跳过该行

比如说,

$sql_dir="SELECT dirid FROM lit_directories";
$result_dir=mysql_query($sql_dir);
   while ($row_dir=mysql_fetch_assoc($result_dir)) {

   $sql_notes="SELECT notes, dirid FROM lit_notes WHERE dirid='".$row_dir['dirid']."'";
   $result_notes=mysql_query($sql_notes);
      while ($row_notes=mysql_fetch_assoc($result_notes)) {
         if($row_notes['notes'] == ''){
             continue;
         }
         echo $row_notes['notes'];
      }
   }

但就性能而言,我认为应该使用更好的方法,Preet Sangha的解决方案。

我将对我的帖子进行编辑,对此我深表歉意。这是我困惑的主要原因。正在打印的dirid在内部循环之外,所以我不知道如何检查匹配项,或者它是否像您那样是空白的。我将编辑我的帖子。我想可能会让我困惑的是,在阅读了左边的JOIN之后,结果似乎会显示出来,即使某些表列上的结果为空。我其实不想显示那些空洞的结果。如果我解释得不好,我道歉。不过,你的帖子可能会让我找到答案。我试试看。在这个链接上,它显示了一个简化的mysql查询,就在左连接示例之前。添加了WHERE n.notes NOT NULL以更正查询。这将消除notes notes 3&4 notes NULL或空字符串的行?