2016-02-22 3 views
3

Здравствуйте, я попытался решить проблему с сортировкой по категориям и подкатегориям SQL, чтобы выбрать элемент html. Я не нашел ничего, что должно сработать для меня. У меня есть таблица categories, и это выглядит какSQL get Категории с подкатегориями

id  name  parent 
1  cat1  0 
2  sub1  1 
3  cat2  0 
4  sub2  1 

Мой запрос выглядит следующим образом

SELECT `a`.*, `b`.* 
FROM `categories` AS `a` 
LEFT JOIN `categories` AS `b` 
    ON `a`.`id` = `b`.`parent` 
WHERE `a`.`parent` IS NULL 

но это возвращение мне пустой массив: - /, пожалуйста, помогите.

Я хочу привести, как это:

cat1 
    sub1 
    sub2 
cat2 
+4

Изменить 'where a.parent null 'to' где a.parent = 0' – Daan

+0

Какой результат вы хотите? –

+0

Отредактировано, посмотрите, что я хочу получить, каждая строка, представляющая html

ответ

0

Вы получаете пустой массив для фильтрации по «нулевой». Изменить запрос

"SELECT a.*, b.* from `categories` as a left join `categories` as b on a.id = b.parent where a.parent = 0" 

Это должно сделать трюк.

+0

Все еще не работает, sry, попробуйте посмотреть обновленный пост, я добавил, как я хочу выглядеть, в любом случае спасибо. –

+0

Может ли родитель иметь больше родителей? – bastiherrmann

0

Вы можете сделать это на php с легкостью. Таким образом, чтобы легко справиться с текущей моделью данных, реализована рекурсия в функции, которая получит родительский идентификатор, начиная с нуля.

В простой sql ваша проблема заключается не в том, как получить, а в том, как хранить ваши данные, на первом месте. Я имею в виду, если вы хотите сделать это в одном SQL (иначе вы можете попробовать хранимую процедуру).

В простом sql есть много способов сделать это. Например, самый простой для извлечения - самый сложный для хранения.

магазин ваш родитель ID в строку:

Id Name  node 
1 Cat1.   1 
2 Cat2.   2 
3 subcat11. 1.1 
4 Cat 3.   3 
5 subcat12. 1.2 
6 subcat21. 2.1 

Тогда это было бы просто:

Select name,ID,node from table order by node 
0
$query = "SELECT a.*, b.* from `categories` as a left join `categories` as b on a.id = b.parent where a.parent=0"; 
return $db->select($query); 

enter image description here

0

Как уже говорили другие, я думаю, вы должны повторно -подумайте, как вы храните свои данные, или это будет сложнее получить, так как сказано:

Предполагая, что вы используете MySql:

select 
sub.id as id, 
case 
    when sub.parent is null then sub.name 
    else concat(' ', sub.name) 
end as category_name, 
cat.name as subcategory_name, 
sub.parent 
from categories as cat 
right outer join categories as sub 
    on cat.id=sub.parent 
where cat.parent is null or cat.parent='0' 
order by sub.id, sub.name; 

И для PostgreSQL:

select 
sub.id as id, 
case 
    when sub.parent is null then sub.name 
    else ' ' || sub.name 
end as category_name, 
cat.name as subcategory_name, 
sub.parent 
from categories as cat 
right outer join categories as sub 
    on cat.id=sub.parent 
where cat.parent is null or cat.parent=0 
order by sub.id, sub.name; 

Если вывести что-то вроде этого:

Sample resultset

Таким образом, вы уже можете отправить текст с отступом (и вы также получаете идентификатор элемента), который вы пытаетесь заполнить в выборе, я предполагаю. Возьмите поля id и category_name из вашего набора/массива PHP.

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