2009-05-09 18 views
2

ネストされたセットモデルを使用して、iPhone上のローカルSQLiteデータベースに大きな階層のデータを格納しています。私は自分のWebサイトからMySQL tech articleを読んでいますが、彼らが提案した(そして私が必要とする)クエリーの1つはSQLiteで動作しないと思われ、どのように回避するのか分かりません。SQLiteクエリのサブクエリが機能しない

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はsub_tree.nameが列ではありません、と私はそのサブクエリの実装が不完全であるためであると仮定していることを報告します。誰もこの制限を回避する方法についてのアイデアはありますか?

クエリの目的は、与えられた親ノードのすべての直接の子を取得することです。

答えて

3

すなわち

、サブクエリで「名前としてnode.name」を使用してみてください
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; 

少なくともエラーを取り除くように思われます。

+1

ほぼ完全に固定しました。なんらかの理由で、摂取深度<= 1の部分は効果がなかった。それは、sub_tree.depthとトップレベルの深さの間で混乱していたことが判明しました。私はちょうどトップレベルの名前を変更し、それは働いた。ありがとう! –

関連する問題