Ich möchte meine Daten nach 3 Spalten filtern.Problem mit SQL-Filterung Parent-ID, ID und Sortierung
- PARENT_ID
- id
- Art
Beispiel Basis BDD:
id | parent_id | sort | text
-----------------------------
1 | NULL | 3 | D
2 | 10 | 0 | AA
3 | NULL | 1 | B
4 | 10 | 2 | AB
5 | 3 | 0 | BA
6 | 8 | 0 | CA
7 | 3 | 2 | BC
8 | NULL | 2 | C
9 | 3 | 1 | BB
10 | NULL | 0 | A
11 | 1 | 0 | DA
Ich möchte dieses Ergebnis erhalten:
id | parent_id | sort | text
-----------------------------
10 | NULL | 0 | A
2 | 10 | 0 | AA
4 | 10 | 2 | AB
3 | NULL | 1 | B
5 | 3 | 0 | BA
9 | 3 | 1 | BB
7 | 3 | 2 | BC
8 | NULL | 2 | C
6 | 8 | 0 | CA
1 | NULL | 3 | D
11 | 1 | 0 | DA
Ich versuche mit einer COALESCE
Funktion ohne Erfolg: SELECT * FROM menu ORDER BY COALESCE(parent_id, id) ASC, parent_id ASC, sort ASC
.
Ich denke, dass es eine Ordnung Logik ist mit COALESCE
Funktion Priorität gesetzt werden ... Ich bin nicht sicher ...
- Schritt 1: sortiert nach parent_id ASC wenn NULL IST
- Schritt 2: sortiert nach parent_id ASC, wenn NOT NULL
Daten für Live-Test: http://sqlfiddle.com/#!9/ed850/1
SOLUTION (Arbeit für symfony mit Lehre)
Thank @quadzz und andere für Ihre Antworten
SELECT test.*,
(CASE
WHEN test.parent_id IS NULL THEN test.sort
ELSE test_1.sort
END) AS test1,
(CASE
WHEN test.parent_id IS NULL THEN 1
ELSE 0
END) AS test2
FROM test AS test
LEFT JOIN test AS test_1
ON (test_1.id = test.parent_id)
ORDER BY test1 ASC,
test2 DESC,
test.sort ASC
Live-Ergebnis: http://sqlfiddle.com/#!9/ed850/4
Sie immer nur eine Ebene der Hierarchie? (Jede Zeile ist * entweder * ein Elternteil oder ein Kind, niemals beide Großeltern oder tiefere Beziehungen) –