使用哪个JOIN

时间:2013-11-14 12:45:52

标签: php sql join

我正试图从表中获取信息。

我有电路板和子板。表sub_id中的列board告诉我该板是否是子板。如果是子板,那么父板的id是值,如果不是,那么单元格为空。

我写这篇文章是为了显示董事会是否有任何子板:

<?php 
$data = mysql_query("SELECT * FROM board WHERE sub_id='$boardId'") 
or die(mysql_error()); 
while($info = mysql_fetch_array( $data )) 
{ 
Print "<br>Sub-collections:<br>";
Print "<font size='5pt'><a href='/board/index/".$info['id']."'>".$info['board_name']."    </a></font>";
} 
?>

这很好用。

现在我想写一个类似的代码来命名父板(如果主板是子板),但这是我遇到麻烦的地方。

我想出了:

<?php 
$data = mysql_query("select * from board WHERE id='$boardId' AND sub_id IS NOT NULL")     or die(mysql_error());
$issub = mysql_fetch_array($data);
?>

然后使用......

<?php if(($issub)): ?>
<?php echo $issub['sub_id'] ?>
<?php else: ?>
<?php endif ?>

显示。

问题是没有join除了父委员会的id之外我无法显示任何内容。我不知道要加入哪些列以提取board_name等信息。

编辑:

popovitsj的建议:

<?php 
$data = mysql_query("SELECT * FROM board b WHERE EXISTS(SELECT * FROM board WHERE b.id     = sub_id)") or die(mysql_error()); 
while($info = mysql_fetch_array( $data )) 
{ 
Print "<br>Sub-collection of:<br>";
Print "<font size='5pt'><a href='/board/index/".$info['id']."'>".$info['board_name']."    </a></font>";
} 
?>

这在一定程度上起作用。它在子板页面上正确显示父板,但也在父板页面上错误地显示它。

EDIT2:

在根据Meier的建议研究LEFT JOIN之后,我最终使用此代码使其工作:

SELECT * FROM board a LEFT JOIN board b ON a.sub_id = b.id WHERE a.sub_id LIKE b.id AND a.id='$boardId'

2 个答案:

答案 0 :(得分:2)

在我回答这个问题之前:您是否100%确定$boardid不是直接来自http,因此可由用户操纵,因此您的用户无法启动SQL注入?

您需要的联接是“外部自我加入”。外部联接,因为您还希望显示没有父级的板。外连接也称为左连接。 自连接,因为表连接到自身。自连接的技巧是在语句中为表提供不同的名称,这样就可以区分父级和子级。

快速谷歌搜索“sql外部自我加入”给了我这个,这很好地解释了它。 例子是员工和经理,经理也是员工。所以这个例子与你的非常相似: http://blog.sqlauthority.com/2010/07/08/sql-server-the-self-join-inner-join-and-outer-join/

答案 1 :(得分:1)

对此有不同的解决方案。一个可能的是:

SELECT * FROM Board b
WHERE EXISTS
   (SELECT * FROM Board
    WHERE b.id = sub_id);

另一个可能的解决方案是,这只显示'根'父板。 (没有父母的董事会)。

SELECT * FROM Board b
WHERE sub_id IS NULL;