2016-03-21 1 views
0

Tabellennamen haben: EbeneFinden Sie heraus, nur die IDs, die keine Kinder ORDER BY Eltern und Großeltern

+-----+-------------------+----------+ 
| id | name    | parentid | 
+-----+-------------------+----------+ 
| 1 | AIR CONDITIONER | 0  | 
| 2 | TV    | 0  | 
| 3 | SPLIT TYPE  | 1  | 
| 4 | WINDOWS TYPE  | 1  | 
| 5 | LCD    | 2  | 
| 6 | PLASMA   | 2  | 
| 7 | MUSIC PLAYER  | 0  | 
| 8 | AC 0.75 TON  | 3  | 
| 9 | AC 1 TON   | 3  | 
| 10 | WT 0.75 TON  | 4  | 
| 11 | WT 1 TON   | 4  | 
| 12 | LCD 32" UP  | 5  | 
| 13 | LCD 4" UP  | 5  | 
| 14 | PHOTO ALBUMS  | 0  | 
| 15 | STANDUP TYPE  | 1  | 
| 16 | CD PLAYERS  | 7  | 
| 17 | MP3 PLAYERS  | 7  | 
| 18 | CDS    | 0  | 
| 19 | BOOKS   | 0  | 
| 20 | PORTABLE TV  | 2  | 
+-----+-------------------+----------+ 

So zuerst, ich müde, alle IDs, um herauszufinden, die keine Kinder mit der folgenden Abfrage hat:

SELECT 
     t1.id, 
     t1.name AS name, 
     t2.id AS parentid, 
     t2.name AS parent_name, 
     t3.id AS grandparentid, 
     t3.name AS grandparent_name 
FROM level t1 
     LEFT JOIN level t2 ON t1.parentid=t2.id 
     LEFT JOIN level t3 ON t2.parentid=t3.id 
     WHERE t1.id NOT IN (SELECT parentid from level) 

Und Sie erhalten das folgende Ergebnis

+-----+--------------+----------------+-------------------+ 
| id | name  | parent_name | grandparent_name | 
+-----+--------------+----------------+-------------------+ 
| 6 | PLASMA  | TV    | NULL    | 
| 8 | AC 0.75 TON | SPLIT TYPE  | AIR CONDITIONER | 
| 9 | AC 1 TON  | SPLIT TYPE  | AIR CONDITIONER | 
| 10 | WT 0.75 TON | WINDOWS TYPE | AIR CONDITIONER | 
| 11 | AC 1 TON  | WINDOWS TYPE | AIR CONDITIONER | 
| 12 | LCD 32" UP | LCD   | TV    | 
| 13 | LCD 42" UP | LCD   | TV    | 
| 14 | PHOTO ALBUM | NULL   | NULL    | 
| 15 | STANDUP TYPE | AIR CONDITIONER| NULL    | 
| 16 | CD PLAYERS | MUSIC PLAYER | NULL    | 
| 17 | MP3 PLAYERS | MUSIC PLAYER | NULL    | 
| 18 | CDS   | NULL   | NULL    | 
| 19 | BOOKS  | NULL   | NULL    | 
| 19 | BOOKS  | NULL   | NULL    | 
+-----+--------------+----------------+-------------------+ 

Dies ist nur die IDs bekommt, die keine Kinderaufzeichnen habenAber ich brauche eine Option wählen Sie das Menü erstellen, die benutzerfreundlich ist wie folgt:

I ORDER BY t2.parentid DESC versucht haben, DESC t1.prentid aber die Art und Weise wollte ich nicht

erhalten BEISPIEL (Sie können dieses Beispiel ignorieren. Nur um eine Idee zu geben, was ich erreichen müssen):

<option>Air Conditioner >> STANDUP TYPE</option> 
<option>Air Conditioner >> SPLIT TYPE >> AC 0.75 TON</option> 
<option>Air Conditioner >> SPLIT TYPE >> AC 1 TON</option> 
<option>Air Conditioner >> WINDOWS TYPE >> AC 0.75 TON</option> 
<option>Air Conditioner >> WINDOWS TYPE >> AC 1 TON</option> 
<option>BOOKS</option> 
<option>CDS</option> 
<option>MUSIC PLAYERS >> MP3 PLAYERS</option> 
<option>MUSIC PLAYERS >> CDS PLAYERS</option> 
<option>PHOTO ALBUM</option> 
<option>TV >> LCD >> LCD 32" UP</option> 
<option>TV >> LCD >> LCD 42" UP</option> 
<option>TV >> PLASMA</option> 
<option>TV >> PORTABLE TV</option> 

Also muss ich eine andere Abfrage herauszufinden:

FÜHREN ERWARTEN

+-----+-------------------+------------------+--------------+ 
| id | grandparent_name | parent_name  | name  | 
+-----+-------------------+------------------+--------------+ 
| 15 | NULL    | AIR CONDITIONER | STANDUP TYPE | 
| 8 | AIR CONDITIONER | SPLIT TYPE  | AC 0.75 TON | 
| 9 | AIR CONDITIONER | SPLIT TYPE  | AC 1 TON  | 
| 10 | AIR CONDITIONER | WINDOWS TYPE  | WT 0.75 TON | 
| 11 | AIR CONDITIONER | WINDOWS TYPE  | AC 1 TON  | 
| 19 | NULL    | NULL    | BOOKS  | 
| 18 | NULL    | NULL    | CDS   | 
| 16 | NULL    | MUSIC PLAYERS | CD PLAYERS | 
| 17 | NULL    | MUSIC PLAYERS | MP3 PLAYERS | 
| 14 | NULL    | NULL    | PHOTO ALBUM | 
| 12 | TV    | LCD    | LCD 32" UP | 
| 13 | TV    | LCD    | LCD 42" UP | 
| 6 | NULL    | TV    | PLASMA  | 
| 20 | NULL    | TV    | PORTABLE TV | 
+-----+-------------------+------------------+--------------+ 

Ist das erreichbar? Kann ich CASE WHEN und wie?

Oder muss ich PHP verwenden, um das Ergebnis neu zu ordnen?

THX

Antwort

1

das ist etwas anderes Ergebnis als man wollte, aber ich denke, itis was Sie wirklich wollen:

SELECT (CASE WHEN l3.id IS NOT NULL THEN l3.id WHEN l2.id IS NOT NULL THEN l2.id ELSE l1.id END) as last_level_id, l1.name, l2.name, l3.name 
FROM level l1 
LEFT JOIN level l2 on l2.parentid = l1.id 
LEFT JOIN level l3 on l3.parentid = l2.id 
WHERE l1.parentid = 0 
ORDER BY l1.id, l2.id, l3.id 
+0

Ja, ich glaube, von dort gehen kann! –

Verwandte Themen