2016-04-28 18 views
0

wenn ich eine Tabelle wie dieseComplex Reihenfolge von mysql

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

Wie kann ich Aufzeichnungen bestellen 15-ID 18 nach ID zeigen?

+0

wollen Sie statische Sortierung? –

+0

was meinst du mit statischer Sortierung? – andyts93

+0

Wie möchten Sie Ihre Datensätze sortieren? – Sadikhasan

Antwort

0

Sorry, ich habe ein einfaches Beispiel verwendet, aber meine Tabelle ist komplexer. Der id_alternativo kann rekursiv sein (id 18 könnte eine id_alternativo = 19 haben) und so weiter und id_alternativo könnte nicht die höchste ID auf der Tabelle sein, so dass ORDER BY id_alternativo DESC, id DESC nicht funktioniert. Hier ist eine Abfrage von meinem Tisch:

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 

Hier ist das Ergebnis

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

Ich musste compatibile ab bestellen und dann bestellen Sie die anderen Datensätze durch die Beziehung beetween id_alternativo und id. So löste ich dieses eine neue Spalte wie mit

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 

Und ich habe das gewünschte Ergebnis

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

von dem, was ich verstehe, verwenden Sie einfach order by id (18, 15) und jede andere ID, die Sie benötigen.

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

können Sie bestellen wie folgt verwenden:

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

Probe

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

Mit Blick auf die MySQL-Dokumentation können Sie mehrere Spalten in Ihrer Art und verwenden DESC/ASC verwenden pro Säule.

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

Wenn ich es richtig verstehe, was Sie meinen Ihre Abfrage wie folgt aussehen:

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

Ich denke, das OP will alle alternativen IDs nach der Haupt-ID (15, dann 18, weil eine alternative ID von 15, dann 16, 17, etc.) – fthiella

1

Eine Lösung, die ein Self-Join wie folgt zu verwenden:

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

dieser Wille setze alle alternativen IDs nach der Haupt-ID (in diesem Fall werden 18 auf 15 folgen).

Bitte sehen Sie eine Geige here. Bitte beachten Sie, dass dies funktioniert, es sei denn, eine alternative ID hat eine andere alternative ID (z. B. wenn 18 selbst eine andere alternative ID hat), aber dies kann nicht allein mit MySQL gelöst werden, da rekursive Abfragen noch nicht unterstützt werden.

+0

Danke, Ihre Lösung funktioniert, wenn eine alternative ID hat keine alternative ID selbst, aber in meinem Fall könnte es. Übrigens habe ich eine Lösung gefunden und ich habe meine Antwort gepostet :) – andyts93