Я думаю, что вам нужно будет создать список идентификаторов категорий, чтобы затем создать предложение IN
для вашего sql.Допустим, у вас есть следующая структура категории:
- Автомобили (id: 1)
- Toyota (id: 2, родитель: 1)
- Mini (id:3, родитель: 2)
- Венчик (id: 4, родитель: 3)
- Holden (id: 5, родитель: 1)
- Спорт (id: 6, родитель: 5)
- HSV (id: 7, родитель: 6)
Получить всепотомки категории, вам нужно перебрать структуру родитель / потомок примерно так:
/**
* I'm only writing pseudocode here btw; I haven't tested it.
* Obviously you'll need to fire the SQL commands...
*/
function getKids ($id, $found = array())
{
array_push ($found, $id);
$nbrKids = "select count(id) from category where parent_id = $id";
if ($nbrKids > 0) {
$newKids = "select id from category where parent_id = $id";
foreach ($newKids as $kid) {
return getKids ($kid, $found);
}
}
else {
return $found;
}
}
Затем вызовите getKids()
вот так, где $id
- это идентификатор вашей категории:
$ids = getKids($id);
$ids
- это массив всех категорий, которые вас интересуют. Затем вы можете использовать join()
для построения строки SQL:
$sql = "select * from cars where category_id in (" . join (",", $ids) . ")";
Для правильности вы должны проверитьчто $ids
имеет по крайней мере 1 член первым, иначе ваш запрос SQL будет недействительным.
[edit: фактически в приведенном выше коде, $ids
всегда будет иметь хотя бы одного члена: начальный идентификатор.Тем не менее, код не подтверждает, что начальный идентификатор является допустимым category_id.]