1

我正在尝试从表中获取信息。

我有板和子板。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>";
} 
?>

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

编辑2:

在 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'

4

2 回答 2

2

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

您需要的联接是“外部自联接”。外部联接,因为您还想显示没有父级的板。外连接也称为左连接。自连接,因为表连接到自身。自连接的技巧是在语句中为表赋予不同的名称,以便您可以区分父级和子级。

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

于 2013-11-14T13:08:47.773 回答
1

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

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

另一种可能的解决方案可能是这样,这仅显示“根”父板。(没有父母的董事会)。

SELECT * FROM Board b
WHERE sub_id IS NULL;
于 2013-11-14T12:53:50.433 回答