2010-01-01 2 views
3

У меня есть 2 таблицы. Одна таблица - «заголовки» & содержит заголовки, а другая - «подзаголовки» и содержит подзаголовки, которые (& должны быть) классифицированы под заголовками и должны иметь соответствующую рубрику. Подзаголовок может иметь только один заголовок, и многие подзаголовки могут иметь одно и то же заголовок. Поэтому рассмотрим следующий формат:PHP повторяющиеся строки только один раз

--Table heading 

heading_id heading 
1   H1 
2   H2 
3   H3 


--Table sub_heading 

sub_head_id sub_heading heading_id 
1   SH1    1 
2   SH2    1 
3   SH3    2 
4   SH4    3 
5   SH5    2 
6   SH6    4 

То, что я хотел бы сделать, это запрос к базе данных только один раз и получить все sub_headings и соответствующие заголовки (используя внутреннее соединение?) И выводить Heading только один раз и перечислить все sub_headings перечисленных в их соответствующих заголовках. Таким образом, на практике, я хотел бы показать вверх OUTPUT AS РЕЗУЛЬТАТ:

H1 
--SH1 
--SH2 

H2 
--SH3 
--SH5 

H3 
--SH4 

H4 
--SH6 

Как вы можете видеть, Заголовки через echo только один раз, и все подзаголовки, которые принадлежат к подразделу хорошо показаны под их соответствующим заголовком. Поэтому я хотел бы знать, какой запрос я бы написал для этого.

ПРИМЕЧАНИЕ: Я уже написал код для извлечения header_id, и при этом в цикле запросите базу данных для соответствующих подзаголовков. Это снова приводит к циклу sub_headings. Но (я чувствую) недостаток в этом заключается в том, что для каждого существующего заголовка, который существует, БД будет запрашиваться хотя бы один раз, чтобы получить соответствующие подзаголовки. Таким образом, если существует 50 заголовков, и, получая их в цикле, выполняется второй запрос для получения подзаголовков. Мне нужно записать второй запрос, чтобы получить подзаголовки и обработать их в цикле. Я хочу избежать этого.

Так что это действительно поможет, если кто-нибудь скажет мне, как запросить БД только один раз и вывести результат, как я указал выше. Заранее спасибо.

ответ

3
$query = "SELECT 
    h.heading, 
    s.sub_heading 
FROM 
    heading h 
LEFT JOIN 
    sub_heading s 
ON 
    h.id = s.heading_id 
ORDER BY 
    s.heading_id ASC, 
    s.sub_head_id ASC"; 

$resource = mysql_query($query); 

$previous_heading = false; 

// This will print the headings in a unordered list, modify if needed 
echo '<ul>'; 
while($resource = mysql_fetch_assoc($resource)) { 
    if(!$previous_heading || $previous_heading != $resource['heading']) { 
     if($previous_heading) { 
      echo '</ul></li>'; 
     } 
     echo '<li>'.$resource['heading'].'<ul>'; 
    } 
    echo '<li>'.$resource['sub_heading'].'</li>'; 
    $previous_heading = $resource['heading']; 
} 
echo '</ul></ul>'; 

Выведет что-то вроде

  • H1
    • Ш1
    • SH2
  • Н2
    • SH3
    • SH5
  • Н3
    • SH4
  • Н4
    • SH6
+0

УДИВИТЕЛЬНЫЙ! Отлично! Большое спасибо. – Devner

+0

@Tatu, в вашем запросе отсутствует запятая, мой друг. Оно должно быть: s.heading_id ASC, s.sub_head_id ASC Незначительная коррекция, но может помочь любому в будущем. – Devner

+0

@ Devner, спасибо, что указали это. –

3
select * 
from heading h, subheading s 
where s.h = h.id 
order by h.title, s.title 

цикл по результату и когда heading_id изменения, выход новый раздел

+0

Спасибо за ваш комментарий. Вы правы в отношении цикла, но на самом деле мне нужен код, чтобы сделать то, что предоставил другой пользователь (Tatu). Я ценю ваши усилия, чтобы ответить на мой вопрос. – Devner

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