2016-04-28 51 views
0

,如果我有这样的复杂的顺序由MySQL

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

如何订购的记录编号15后,出示身份证18表?

+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  | 
+-------+-------------+----------------+ 

我不得不下令compatibile说明,然后由beetween id_alternativo和id的关系责令其他记录。所以,我解决了使用新列这样

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)和任何其他你需要的ID。

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后面的主ID(15,然后18,因为是15替代id,然后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 

这将在主ID之后放置所有备选ID(在这种情况下,18将跟随15)。

请参阅小提琴here。请注意,这将工作,除非替代ID有另一个替代ID(例如,如果18本身有另一个替代ID),但这不能纯粹用MySQL解决,因为它不支持递归查询。

+0

谢谢,您的解决方案工作,如果替代ID没有替代ID本身,但在我的情况下,它可以。顺便说一句我找到了一个解决方案,我发布了我的答案:) – andyts93