2015-12-02 3 views
0

Так у меня есть таблица в базе данных MariaDB с несколькими рядами, как:Сортировка строк с параметром ид

+----+--------+-----------+---------+-----------+ 
| id | faseID | fase_tipo | fase_nr | tarefa_id | 
+----+--------+-----------+---------+-----------+ 
| 5 |  3 |   2 |  1 |   2 | 
| 6 |  3 |   2 |  2 |   2 | 
| 17 |  3 |   2 |  3 |   2 | 
| 12 |  3 |   3 |  1 |   6 | 
| 18 |  3 |   3 |  2 |   6 | 
+----+--------+-----------+---------+-----------+ 

вырабатываться:

SELECT id, 
     faseID, 
     fase_tipo, 
     fase_nr, 
     tarefa_id 
    FROM tarefas 
    WHERE obra = '15ID000' AND 
     faseID = '3' AND 
     tarefa_id <> '0' AND 
     tarefa_main = '2' 
    ORDER BY fase_tipo ASC 

У меня возникли проблемы с приказывая этот результат поиска, потому что Я хочу, чтобы таблица заказана как:

+----+--------+-----------+---------+-----------+ 
| id | faseID | fase_tipo | fase_nr | tarefa_id | 
+----+--------+-----------+---------+-----------+ 
| 5 |  3 |   2 |  1 |   2 | 
| 6 |  3 |   2 |  2 |   2 | 
| 12 |  3 |   3 |  1 |   6 | 
| 18 |  3 |   3 |  2 |   6 | 
| 17 |  3 |   2 |  3 |   2 | 
+----+--------+-----------+---------+-----------+ 

То, что я имею в виду, используйте поле tarefa_id для мака e строки появляются после строки с этим id. И внутри, которые были заказаны с fase_nr.

Есть ли какой-либо цель для всех строк с tarefa_id для отображения после id = tarefa_id?

+2

Ваш пример не имеет смысла. Нет строк, где 'id' =' tarefa_id'. –

+0

@ gimley, мне нужно иметь строки, в которых 'tarefa_id' присутствует в' id', чтобы показать после того, как строка с указанным «id» будет напечатана. @GordonLinoff, есть строка с 'id' = 6 и две строки с' tarefa_id' = 6 – Comum

+0

Несколько вопросов: 1. Почему ваш код говорит 'ORDER BY fase_tipo', если это не то, что вы хотите? 2. Почему «id = 17» не появляется после «id = 6»? 3. Есть ли правило, в котором указано, что 'id' всегда больше, чем' tarefa_id'? – Niklas

ответ

1

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

with test_data as (
     select 5 as id, 3 as faseID, 2 as fase_tipo, 1 as fase_nr, 2 as tarefa_id from dual 
     union all 
     select 6 as id, 3 as faseID, 2 as fase_tipo, 2 as fase_nr, 2 as tarefa_id from dual 
     union all 
     select 12 as id, 3 as faseID, 3 as fase_tipo, 1 as fase_nr, 6 as tarefa_id from dual 
     union all 
     select 18 as id, 3 as faseID, 3 as fase_tipo, 2 as fase_nr, 6 as tarefa_id from dual 
     union all 
     select 17 as id, 3 as faseID, 2 as fase_tipo, 3 as fase_nr, 2 as tarefa_id from dual 
    ) 
    -- This is the core you should pay attention to 
    select td1.* 
    from test_data td1 
    left join test_data td2 
    on td2.id = td1.tarefa_id 
    order by coalesce(td2.id, td1.id), td1.id, td1.fase_nr 
    -- 
; 

Предоставлено, я сделал это в Oracle, но общая идея должна применяться.

Выход:

ID|FASEID|FASE_TIPO|FASE_NR|TAREFA_ID 
--+------+---------+-------+--------- 
5|  3|  2|  1|  2 
6|  3|  2|  2|  2 
12|  3|  3|  1|  6 
18|  3|  3|  2|  6 
17|  3|  2|  3|  2 

Если столбцы не числового типа вам нужно будет преобразовать их в предложении order by для сортировки:

with test_data as (
    select '12' as id, '3' as faseID, '3' as fase_tipo, '1' as fase_nr, '6' as tarefa_id from dual 
    union all 
    select '5' as id, '3' as faseID, '2' as fase_tipo, '1' as fase_nr, '2' as tarefa_id from dual 
    union all 
    select '18' as id, '3' as faseID, '3' as fase_tipo, '2' as fase_nr, '6' as tarefa_id from dual 
    union all 
    select '6' as id, '3' as faseID, '2' as fase_tipo, '2' as fase_nr, '2' as tarefa_id from dual 
    union all 
    select '17' as id, '3' as faseID, '2' as fase_tipo, '3' as fase_nr, '2' as tarefa_id from dual 
) 
-- This is the core you should pay attention to 
select td1.* 
from test_data td1 
left join test_data td2 
on td2.id = td1.tarefa_id 
order by to_number(coalesce(td2.id, td1.id)), to_number(td1.id), to_number(td1.fase_nr) 
-- 
; 
+0

Я тоже думал о левом объединении. Это все еще дает мне неправильный порядок. – Comum

+0

Я получаю точный порядок, указанный вами в вашем вопросе, когда я выполняю вышеуказанное. – gmiley

+0

Я адаптировали ядро ​​к этому: 'выберите td1.id, td1.faseID, td1.fase_tipo, td1.fase_nr, td1.tarefa_id из tarefas td1 покинул присоединиться tarefas TD2 на td2.id = td1.tarefa_id где td1.obra = '15ID000' И td1.faseID = '3' AND td1.tarefa_id <> '0' AND td1.tarefa_main = '2' order by coalesce (td2.id, td1.id), td1.id, td1 .fase_nr; ' И я получил то же, что и в первой таблице. – Comum

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