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

时间:2013-03-05 10:02:25

标签: mysql select

我正在拉一个目录的主列表并循环,然后嵌套在循环中我拉着一组与每个目录匹配的笔记。

在下面的示例中,我怎么不显示dir 3和dir 4列表?这些代表了类别的徽标,如果结果为空,我不希望这些徽标显示出来。我读了INNER JOIN,但它似乎不符合这个需求,或者至少我不明白。

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

$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 |               <---- 
|       |                     
-----------------------

2 个答案:

答案 0 :(得分:2)

试试这个:

$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'];
}  

答案 1 :(得分:0)

我会推荐Preet Sangha建议的内容。换句话说,如果找不到备注,您可以跳过该行。

例如,

$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的解决方案。