2009-05-09 7 views
2

J'utilise le modèle de jeu imbriqué pour stocker une grande hiérarchie de données dans une base de données SQLite locale sur un iPhone. J'ai lu le MySQL tech article de leur site Web sur la façon de faire cela, mais l'une des requêtes qu'ils suggèrent (et dont j'ai besoin) ne semble pas fonctionner avec SQLite et je ne suis pas sûr de savoir comment le contourner.La sous-requête dans la requête SQLite ne fonctionne pas

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM line_items AS node, 
    line_items AS parent, 
    line_items AS sub_parent, 
    (SELECT node.name, (COUNT(parent.name) - 1) AS depth 
     FROM line_items AS node, 
     line_items AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = 'Power Up' 
     GROUP BY node.name 
     ORDER BY node.lft 
    ) AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth <= 1 
ORDER BY node.lft; 

SQLite rapporte que sub_tree.name n'est pas une colonne, et je suppose que cela est parce que sa mise en œuvre du sous-requête est incomplète. Est-ce que quelqu'un a des idées sur la façon de contourner cette limitation?

Le but de la requête est d'obtenir tous les enfants immédiats d'un nœud parent donné.

Répondre

3

Essayez d'utiliser « node.name AS nom » dans la sous-requête, à savoir

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM line_items AS node, 
    line_items AS parent, 
    line_items AS sub_parent, 
    (SELECT node.name AS name, (COUNT(parent.name) - 1) AS depth 
     FROM line_items AS node, 
     line_items AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = 'Power Up' 
     GROUP BY node.name 
     ORDER BY node.lft 
    ) AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth <= 1 
ORDER BY node.lft; 

au moins semble se débarrasser de l'erreur.

+1

Presque totalement fixé. Pour une raison quelconque, la profondeur de HAVING <= 1 n'a eu aucun effet. Il s'est avéré que cela devenait confus entre la sub_tree.depth et la profondeur de premier niveau. Je viens de changer le nom du top niveau et ça a marché. Merci! –

Questions connexes