Помогите составить запрос, на выборку из 3х таблиц

Sayrus

Новичок
Помогите составить запрос, на выборку из 3х таблиц

Есть три таблицы, всё работает, проблема в том что вывод повторяется.
Вот так...
Секция 1
ссылка1
ссылка1
ссылка2
Секция 2

Вот код:
PHP:
$CHAPTERquery  = "SELECT * FROM `chapters` ORDER BY chapterId ASC";
	$CHAPTERselect = mysql_query($CHAPTERquery);
	
		while ($CHAPTERrows = mysql_fetch_array($CHAPTERselect, MYSQL_ASSOC)) {
			$chapterId   = $CHAPTERrows['chapterId'];
			$chapterName = $CHAPTERrows['chapterName'];
			echo " <a href='$chapterId'> $chapterName </a><ul> ";
			
				$SECTIONquery = "SELECT
									a.id,
									a.idSection,
									a.idChapter,
									a.pictureName,
									b.sectionId,
									b.sectionName
								 FROM
									books a,
									sections b
								 WHERE
								  	a.idSection=b.sectionId
								 AND
								  	a.idChapter=$chapterId";
				
			$SECTIONselect = mysql_query($SECTIONquery);
			
				while ($SECTIONrows = mysql_fetch_array($SECTIONselect, MYSQL_ASSOC)) {
					$id	  	       = $SECTIONrows['sectionId'];
					$sectionName = $SECTIONrows['sectionName'];
					echo "<li><a href='$id'> $sectionName </a></li>";
				}
			echo "</ul>";
		}
Помогите решить проблему, заранее спасибо.
 

Fratyr

Новичок
Запросы в лупе? О_О
Я думал времена PHPNuke канули в лету, ан-нет.

Я сейчас на работе, времени катать скрипт не шибко много, но я бы поправил для начала вот где:
1) убрать запросы из цикла и разбить на 2 выборки.
2) Названия переменных покороче стоит делать:) лучше комменты ставить рядом, читабельнее.

Далее код:
Код:
$chapters = array();
while ($CHAPTERrows = mysql_fetch_array($CHAPTERselect, MYSQL_ASSOC)) {
            $chapters[ $CHAPTERrows['chapterId'] ][ 'id' ]  = $CHAPTERrows['chapterId'];
            $chapters[ $CHAPTERrows['chapterId'] ][ 'name' ] = $CHAPTERrows['chapterName'];
            $chapters[ $CHAPTERrows['chapterId'] ][ 'html' ] "<a href=\"". $CHAPTERrows['chapterId'] . "\">" . $CHAPTERrows['chapterName'] . "</a><ul> ";
}
Что имеем? массив:
Array( [1] => Array( "id" => 1, "name" => "dummy", "html" => "<a href></a>"))

Далее по списку...
Код:
$SECTIONquery = 'SELECT
                                    a.id,
                                    a.idSection,
                                    a.idChapter,
                                    a.pictureName,
                                    b.sectionId,
                                    b.sectionName
                                 FROM
                                    books a,
                                    sections b
                                 WHERE
                                      a.idSection=b.sectionId
                                 AND
                                      a.idChapter IN(\''. implode( '\',\'', array_keys($chapters) ) .'\')'; 

$SECTIONselect = mysql_query($SECTIONquery);
Значит так, данные получили, при чем по всем чаптерам сразу. Если база распланирована неверно, могут быть нежелательные результаты. Запрос тоже можно переписать под INNER JOIN или LEFT JOIN взависимости от структуры. Я шибко не вникал в выборку. ;-)

Остается пропарсить полученные данные из последней выборки, и перед каждым выводом ставить код который находится в $chapters[ id ][ 'html' ]

Вот как-то так.
 

lart

Guest
Это все можно сделать одним запросом:
$query = "SELECT
a.id,
a.idSection,
a.idChapter,
a.pictureName,
b.sectionId,
b.sectionName,
c.chapterName
FROM
books a,
sections b,
`chapters` c
WHERE
a.idSection=b.sectionId
AND
c.chapterId=a.idChapter
ORDER BY c.chapterId ASC";
//При такой выбоке все группы будут ити по порядку и цикле нужно только проверять когда наченаеться следующая группа
$select = mysql_query($CHAPTERquery);
$lastChapterId=null;
while ($row = mysql_fetch_array($select, MYSQL_ASSOC)) {
if ($row['chapterId']!=$lastChapterId){
//Проверяем если это уже не первый ul нужно закрыть предыдущий
if ($lastChapterId!=null)
echo "</ul>";
echo " <a href='$chapterId'> $chapterName </a><ul> ";
$lastChapterId=$row['chapterId']
}
echo '<li><a href="'.$row['id'].'">'. $row['sectionName'].'</a></li>';
}
 
Сверху