2010-06-30 6 views
1

i ont la structure de tableau suivant tableau "emplacement" a - id - parentLocation_id (rapport à lui-même) - NomComment utiliser imbriquée sélectionnez

nous supposons que nous avons les données suivantes:

id parentLocation_id name 

1   null   Egypt 
2   1    Cairo 
3   2    Zamalek 

ici nous avons trois niveaux d'emplacements, je veux obtenir tous les niveaux (emplacements) qui ont id = 1 ou enfant de location_id.

Le résultat doit avoir tous les trois emplacements si j'ai sélectionné l'emplacement en Égypte (obtenir tous les niveaux d'héritage).

J'ai essayé le

select l.id from Location as l where l.id = 1 or l.id in (select id from Location where parentLocation_id= l.id); 

suivante ici le résultat est correct, et ici je suis arrivé au deuxième niveau seulement.

Comment puis-je faire cela ??

Merci à l'avance

+0

Pouvez-vous avoir seulement 3 niveaux, ou est-ce qu'il y a la moindre chance que vous ayez 4 ou plus? Comme continent (Afrique)? ou suberb (centre-ville)? –

+0

Je n'ai que trois niveaux, je n'ai pas besoin de plus que ça. – Neveen

Répondre

0

Voici une autre réponse qui peut s'adapter mieux vos résultats souhaités. Notez qu'il y a trois (3) places dont vous avez besoin pour mettre l'identifiant désiré

SELECT l1.id AS select_id 
FROM location l1 
WHERE l1.id IN (
    SELECT l2.id 
    FROM location l2, location l3 
    WHERE l2.id = 1 OR l2.parentLocation_id = 1 OR (l2.parentLocation_id = l3.id AND l3.parentLocation_id = 1) 
) 
0

Cette requête fonctionne si vous avez toujours trois niveaux.

SELECT * 
FROM location l1, location l2, location l3 
WHERE l1.id = 1 
    AND l1.id = l2.parentLocation_id 
    AND l2.id = l3.parentLocation_id 

Vous en avez besoin pour tirer seulement 2 niveaux? Par exemple, Egypte, Le Caire s'il n'y avait pas de 3ème niveau (Zamalek)?

+0

Mais j'ai besoin de cette sélection pour être un sous-sélection donc je ne peux pas sélectionner * Je veux sélectionner l'ID comme Sélectionnez l'ID de l'emplacement où l'ID dans (SELECT * DE l'emplacement l1, l'emplacement l2, l'emplacement l3 O WH l1.id = 1 ET l1.id = l2.parentLocation_id ET l2.id = l3.parentLocation_id) Comment puis-je faire cela? Merci d'avance – Neveen

0

Ce que vous voulez stocker est une hiérarchie, et est assez difficile à implémenter correctement dans une base de données.

Jetez un oeil à ce pour plus d'info: Trees and Hierarchies in SQL

Questions connexes