2015-04-22 3 views
1

У меня есть таблица, как этотSql для выбора из таблицы

Id  title   parentId subparentId itemcategory 

1  service cat1 0   0   C 
2  service cat2 0   0   C 
3  service subcat1 1   0   S 
4  service subcat2 2   0   S 
5  Item 1   1   0   I 
5  Item 2   1   3   I 
6  Item 3   2   4   I 

Мне нужно из положить, как этот

service cat1 
     Item 1 

    service subcat1 
     Item 2 

service cat2 
    service subcat2 
     Item 3 

Ie, список показывает элементы (категория, подкатегорий, предметы) в по порядку по возрастанию, и если у товаров есть подкатегория, она должна подпадать под подкатегорию

+1

Не могли бы вы создать http://www.sqlfiddle.com/? – Muggles

+0

Я не думаю, что это возможно с одним запросом. Что вы можете сделать, так это написать хранимую процедуру и временно защитить ваши результаты. Но в итоге вы получите один список с результатами. – solick

ответ

1

Я думаю, вам стоит попробовать что-то вроде:

SELECT 
    t1.title, 
    t2.title, 
    t3.title 
FROM table t1 
LEFT JOIN table t2 ON t1.id = t2.parentId 
LEFT JOIN table t3 ON t2.id = t3.subparentId 
WHERE t1.itemcategory = 'C' 
AND t2.itemcategory = 'S' 
AND t3.itemcategory = 'I' 
; 

Для этого случая: enter image description here

вы должны присоединиться к третьей таблице (пункт), непосредственно с первым столом (услуга кошкой), а не второй, как в моем примере.

1

Это сложная проблема, поскольку в результате выполнения запроса sql может быть только одно измерение.

Но мы можем сделать небольшой трюк здесь

SELECT * 
FROM 
    (
    SELECT 
     id, 
     title, 
     parentId, 
     subparentId, 
     itemcategory, 
     IF(
      parentId = 0 AND subparentId = 0, 
      id * 10000, 
      IF(
       subparentId = 0, 
       parentId * 10000 + 100 - id, 
       parentId * 10000 + subparentId * 100 + id 
     ) 
    ) AS itemOrder 
    FROM 
     table1 
) allOrder 
ORDER BY allOrder.itemOrder 

SQL скрипку: http://sqlfiddle.com/#!9/5f711/1/0

увеличить множитель, если у вас есть несколько строк.

1

Другой способ сделать это: http://sqlfiddle.com/#!9/bbf4d/1
(нет необходимости умножитель здесь)

select 
    concat(indent1, indent2, title) as title 
from (
select 
    if(parentid>0,parentid,id) as id1, 
    case itemcategory 
    when 'C' then -1 
    when 'S' then id 
    when 'I' then if(subparentid>0,subparentid,0) 
    end as id2, 
    case itemcategory 
    when 'C' then -1 
    when 'S' then -1 
    when 'I' then id 
    end as id3, 
    case itemcategory 
    when 'C' then '' 
    when 'S' then '-  - ' 
    when 'I' then '-  - ' 
    end as indent1, 
    case itemcategory 
    when 'C' then '' 
    when 'S' then '' 
    when 'I' then '-  - ' 
    end as indent2, 
    title 
from table1 
order by id1,id2,id3 
) allitems 

Половина этого кода для отступов, так что вы получите более приятный вид. Это точно так же, как вы просили (элементы с одинаковым отступом, даже если они не находятся на одном уровне), но вы можете Fiddle с ним самостоятельно.

Вы также можете добавить id1, id2, id3 в первый раз, чтобы посмотреть, как делается заказ. Выбор снаружи выполняется только для просмотра названия с отступом.

Результат будет:

title 
---------------------- 
service cat1 
- - - - Item 1 
- - service subcat1 
- - - - Item 2 
service cat2 
- - service subcat2 
- - - - Item 3 
Смежные вопросы