INNER JOIN

igortik

Новичок
INNER JOIN

Есть таблицы:

category:

|cat_id|name|
|2 |Категория 1|
|3 |Категория 2|

sub_category:

|cat_id|mother_id|cat_name|
|1 |3 |Подкатегория 1|
|2 |3 |Подкатегория 2|
|3 |2 |Подкатегория 3|

Задача:
Вывести данные из базы на страницу в таком виде:

Категория 1
- Подкатегория 3

Категория 2
- Подкатегория 1
- Подкатегория 2

Я делаю:

PHP:
$query = "SELECT category.name, sub_category.cat_name FROM category INNER JOIN sub_category ON sub_category.mother_id = category.cat_id";
mysql_query("SET NAMES 'cp1251'");
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result))
	{
	$name = $row["name"];
	$sub_name = $row["cat_name"];
	printf("%s<br>-%s<br>",$name,$sub_name);
	}
Такое построение цикла нам не подходит, т.к. данные выйдут в виде:
Категория 1
- Подкатегория 3
Категория 2
- Подкатегория 1
Категория 2
- Подкатегория 2

Вопрос:

Как быть?

P.S. У меня есть решение с циклом в цикле (while), но оно будет ресурсоемким в сравнении с грамотной выдачей при наличии одного запроса к базе.
Прошу Вашего совета!
 

zerkms

TDD infected
Команда форума
запоминать id предыдущей категории и сравнивать с текущим, если изменилось - выводить
 

igortik

Новичок
так все равно выходит двойной цикл, по-моему.
Было бы неплохо увидеть решение, т.к. как обойтись без двух while я пока понять не могу.
 

zerkms

TDD infected
Команда форума
PHP:
$prev_cat_id = 0;
while ($row = mysql_fetch_assoc($result)) {
    if ($prev_cat_id != $row['cat_id') {
        $prev_cat_id = $row['cat_id'];
        echo $row['name'];
    }

    echo $row['cat_name'];
}
 

igortik

Новичок
да, действительно, спасибо большое!
P.S. Я сравнение делал по ошибке для СУбкатегории идентификатора.

Спасибо!

-~{}~ 07.07.08 14:56:

Вдогонку:

Предположим, я добавил некое поле `pos_id`к таблицам
category и sub_category

Это поле будет вмещать числовое значение от 1 до ~ и его цель: ORDER BY `pos_id`

Вопрос:
Как сформулировать запрос к базе, учитывая, что я хочу менять положение ВСЕХ пунктов меню, не только тех, что описаны в таблице category и являются основными.

P.S. для того, чтобы перемещать вверх и вниз основные пункты меню (таблица category), которые будут тянуть за собой подкатегории достаточно сделать запрос:

PHP:
SELECT category.name, sub_category.cat_name FROM category INNER JOIN sub_category ON sub_category.mother_id = category.cat_id ORDER by category.pos_id
А вот как сделать так, чтобы поля `pos_id` таблицы sub_category отражались на расстановке ПОДпунктов????
 

igortik

Новичок
не пойдет, т.к. значения pos_id в таблице sub_category будут также влиять на перемещения вверх-вниз основных пунктов меню.


А мне нужно научить двигаться

Категория 1
- Подкатегория 3 (это)
- Подкатегория 2 (это)
- Подкатегория 1 (и это)

не затрагивая Категория 1
 
Сверху