2013-11-14 5 views
1

Я пытаюсь получить информацию из таблицы.Какой 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 и т.д.

EDIT: предложение

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:

После исследования 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

Немного путайте, что вы вызываете столбец, который ссылается на родительскую sub_board. Вы должны были бы назвать его parent_board. – wvdz

+1

Нелегко понять, как выглядят ваши таблицы. Не могли бы вы прояснить ситуацию? – daker

+0

Это не так. Это 'sub_id'. Я хотел иметь возможность сделать это как можно меньше столбцов. –

ответ

2

Перед тем, как ответить на вопрос: вы 100% уверены, что $boardid не приходит непосредственно от HTTP и поэтому манипулируемо пользователем, так что ваши пользователи не могут создать SQL-инъекции?

Соединение, в котором вы нуждаетесь, является «внешним объединением». Внешнее соединение, потому что вы также хотите отображать доски, у которых нет родителя. Внешнее соединение также называется левым соединением. Самосоединиться, потому что стол соединен с самим собой. Трюк с самосоединением заключается в том, чтобы придать таблице разные имена в инструкции, чтобы вы могли различать родителя и ребенка.

Быстрый поиск по Google для «sql external self join» дал мне это, что объясняет это довольно красиво. Пример с сотрудниками и менеджерами, а менеджеры также являются сотрудниками. Таким образом, пример очень похож на ваш: http://blog.sqlauthority.com/2010/07/08/sql-server-the-self-join-inner-join-and-outer-join/

+0

Попробовал это без везения: выберите * с борта левой платы присоединения b на a.id = b.sub_id WHERE b.sub_id LIKE $ boardId Любые предложения, по-прежнему вызывающие доски, а не родители. Что я могу подобрать? –

+0

Я поиграл с ним и получил его на работу: SELECT * FROM board the LEFT JOIN board b ON a.sub_id = b.id WHERE a.sub_id LIKE b.id AND a.id = '$ boardId' –

1

Существуют различные решения для этого. Один из возможных вариантов:

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

Другим возможным решением может быть это, это только показывает родительские платы «корень». (доски без родителей).

SELECT * FROM Board b 
WHERE sub_id IS NULL; 
+0

Это работает в определенной степени: Подборка:
"; Печать «".$info['board_name'].""; } ?> На домашней странице он правильно идентифицирует родительскую панель. Но на странице родительской платы он также говорит «Sub-collection of ...» и перечисляет себя. –

+0

Этот запрос получает только всех родителей. Если вы хотите, чтобы все дочерние элементы определенного родителя использовали другой запрос. – wvdz

Смежные вопросы