2016-04-28 4 views
0

, если у меня есть таблица, как этотКомплексный заказ по MySQL

+----+----------------+ 
| id | id_alternativo | 
+----+----------------+ 
| 15 |  18  |  
+----+----------------+ 
| 16 |  0  |  
+----+----------------+ 
| 17 |  0  |  
+----+----------------+ 
| 18 |  0  | 
+----+----------------+ 

Как я могу заказать записи, чтобы показать идентификатор 18 после того, как идентификатор 15?

+0

вы хотите статическую сортировку? –

+0

Что вы имеете в виду со статической сортировкой? – andyts93

+0

как вы хотите сортировать свои записи? – Sadikhasan

ответ

0

Извините, я использовал простой пример, но мой стол более сложный. Id_alternativo может быть рекурсивным (id 18 может иметь id_alternativo = 19) и так далее, и id_alternativo не может быть самым высоким id на таблице, поэтому ORDER BY id_alternativo DESC, id DESC не работает. Вот запрос от моего стола:

SELECT 
    a.id, a.compatibile, a.id_alternativo 
FROM 
    ordini_righe AS a 
WHERE 
    intestazione IN (398010) AND a.canc = 0 
     AND a.stato_ordine = 0 

Вот результат

+-------+-------------+----------------+ 
| id | compatibile | id_alternativo | 
+-------+-------------+----------------+ 
|828924 |  0  |  828931  | 
+-------+-------------+----------------+ 
|828925 | 828932 |  0  | 
+-------+-------------+----------------+ 
|828926 |  0  |  0  | 
+-------+-------------+----------------+ 
|828927 |  0  |  0  | 
+-------+-------------+----------------+ 
|828931 |  0  |  828933  | 
+-------+-------------+----------------+ 
|828932 | 828932 |  0  | 
+-------+-------------+----------------+ 
|828933 |  0  |  0  | 
+-------+-------------+----------------+ 

мне пришлось заказать DESC и совместим затем заказать другие записи по отношению Разногласия между id_alternativo и ид. Поэтому я решил, используя новый столбец как этот

SELECT 
    a.id, a.compatibile, a.id_alternativo, IF(id_alternativo = 0, a.id, id_alternativo) ordine 
FROM 
    ordini_righe AS a 
     JOIN 
    locazioni AS b ON a.locazione = b.id 
     JOIN 
    stati_righe AS c ON a.stato_ordine = c.id 
WHERE 
    intestazione IN (398010) AND a.canc = 0 
     AND a.stato_ordine = 0 
ORDER BY compatibile DESC, ordine, a.id ASC 

И я получил желаемый результат

+-------+-------------+----------------+--------+ 
| id | compatibile | id_alternativo | ordine | 
+-------+-------------+----------------+--------+ 
|828925 | 828932 |  828931  | 828925 | 
+-------+-------------+----------------+--------+ 
|828932 | 828932 |  0  | 828932 | 
+-------+-------------+----------------+--------+ 
|828926 |  0  |  0  | 828926 | 
+-------+-------------+----------------+--------+ 
|828927 |  0  |  0  | 828927 | 
+-------+-------------+----------------+--------+ 
|828924 |  0  |  828931  | 828931 | 
+-------+-------------+----------------+--------+ 
|828931 |  0  |  828933  | 828933 | 
+-------+-------------+----------------+--------+ 
|828933 |  0  |  0  | 828933 | 
+-------+-------------+----------------+--------+ 
0

Из того, что я понимаю, просто используйте order by id (18, 15) и любой другой идентификатор, который вам нужен.

0
select id,id_alternativo 
from table_name 
order by case id when 15 Then 1 
        when 18 Then 2 
        when 16 Then 3 
        when 17 Then 4 
      else 5 
      end; 
0

вы можете использовать заказ как это:

SELECT id 
FROM mytab 
ORDER BY IF(id=18,155,id*10); 

образец

MariaDB []> select id from mytab; 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 9 | 
| 10 | 
| 11 | 
| 12 | 
| 13 | 
| 14 | 
| 15 | 
| 16 | 
| 17 | 
| 18 | 
| 19 | 
+----+ 
15 rows in set (0.00 sec) 

MariaDB []> SELECT id 
    -> FROM mytab 
    -> ORDER BY IF(id=18,155,id*10); 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 9 | 
| 10 | 
| 11 | 
| 12 | 
| 13 | 
| 14 | 
| 15 | 
| 18 | 
| 16 | 
| 17 | 
| 19 | 
+----+ 
15 rows in set (0.00 sec) 

MariaDB []> 
3

Глядя на документации MySQL вы можете использовать несколько столбцов в своем роде и использовать DESC/ASC в колонка.

http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

Если я правильно понимаю, что вы имеете в виду ваш запрос будет выглядеть как следует:

SELECT id, id_alternativo FROM table ORDER BY id_alternativo DESC, id DESC; 

+------+----------------+ 
| id | id_alternativo | 
+------+----------------+ 
| 15 |    18 | 
| 18 |    0 | 
| 17 |    0 | 
| 16 |    0 | 
+------+----------------+ 
+0

Я думаю, что OP хочет всех альтернативных идентификаторов, следующих за основным id (15, затем 18, потому что это альтернативный идентификатор 15, затем 16, 17 и т. Д.) – fthiella

1

Одним из решений является использование автообъединение так:

select t.* 
from 
    yourtable t left join yourtable o 
    on t.id = o.id_alternativo 
order by 
    coalesce(o.id, t.id), t.id 

это будет поместите все альтернативные идентификаторы после основного идентификатора (в этом случае 18 будет следовать 15).

См. Скрипку here. Обратите внимание, что это будет работать, если альтернативный идентификатор не имеет другого альтернативного идентификатора (например, если у самого 18 есть другой альтернативный идентификатор), но это не может быть решено исключительно с MySQL, поскольку он еще не поддерживает рекурсивные запросы.

+0

Спасибо, ваше решение работает, если альтернативный идентификатор не имеет альтернативного идентификатора но в моем случае это возможно. Btw Я нашел решение, и я отправил свой ответ :) – andyts93

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