1

テーブルから情報を取得しようとしています。

ボードとサブボードがあります。sub_id表の列boardは、ボードがサブボードであるかどうかを示しています。サブボードの場合id、親ボードの が値になり、そうでない場合、セルは null になります。

ボードにサブボードがあるかどうかを表示するために、これを書きました。

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

4

2 に答える 2

2

$boardid質問に答える前に: がhttp から直接来ていないため、ユーザーが操作できるため、ユーザーが SQL インジェクションを開始できないことを 100% 確信していますか?

必要な結合は「外部自己結合」です。親を持たないボードも表示するため、外部結合します。外部結合は左結合とも呼ばれます。テーブルがそれ自体に結合されているため、自己結合。自己結合の秘訣は、ステートメントでテーブルに異なる名前を付けることです。これにより、親と子を区別できます。

「sql outer 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 に答える