我正试图从表中获取信息。
我有电路板和子板。表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'
答案 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;