2

私の 50% の質問に答えた Mysql の階層データに関するページを見たことがあります。ここにリンクがあります。さて、ネストされたモデルをスローして、ネストされたテーブルの各レコードに対して他のテーブルも結合できればいいのにと思います。たとえば、製品の詳細を含むネストされたモデル階層にデータを保存しています。ここで、どのユーザーがどの製品を購入したかを確認し、そこからユーザーの詳細を取得できるようにしたいと考えています。

user_idまさにその目的のために、テーブルのnested_categoryを含むテーブルにという名前のフィールドを追加しました。最初にユーザーテーブルをチェックして(ログインしているユーザーを検出して)、次に彼が持っている製品の詳細を取得したいと思います。user_iduser_info

その目的のために、私はこのクエリを使用しています-

SELECT node.name, node.category_id, node.comment, node.user_id, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
        nested_category AS parent,
        nested_category AS sub_parent,
        user_info,
        (
                SELECT node.name, (COUNT(parent.name) - 1) AS depth
                FROM nested_category AS node,
                        nested_category AS parent,
                        user_info
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                        AND node.user_id = user_info.user_id AND user_info.user_id = 1
                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
ORDER BY node.lft;

しかし、このクエリは正しく実行されません (つまり、クエリは実行されていますが、詳細は階層化されていません)。誰でも私を助けることができますか?

編集:

コードを少し変更してみましたが、コードは-

SELECT node.name, node.category_id, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
        nested_category AS parent,
        nested_category AS sub_parent
        (
                SELECT node.name, (COUNT(parent.name) - 1) AS depth
                FROM nested_category AS node,
                        nested_category AS parent,
                        LEFT JOIN user_info ON user_info.user_id = node.user_id
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                        AND user_info.user_id = 1
                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
ORDER BY node.lft;

これにより、次のような結果が得られます- mysqlの結果

これには、次の考慮事項があります-

  • category_id のボタン効果 (なぜ?)
  • 出力を生成するために現在 user_id を使用している場合でも、深さの計算が間違っています。

説明してください。

4

1 に答える 1

1

これは MySQL データベースであるため、適切なグループ化フィールドを使用することをお勧めします。select句では非常に多くのフィールドについて言及しましたが、「node.name」のみでグループ化されているためです。他のすべてのデータベース (Oracle/SQLServer など) では、このクエリはエラーをスローしますが、MySQL ではスローしません。

しかし、この単一のグループ化は結果と順序を変更します。

私が正しく理解していれば、順序が異なるだけで適切な結果が得られます。通常、orderby 'node.lft' は正常に機能します。

したがって、適切なグループ化を試して結果を更新してください。

于 2012-08-25T14:00:29.827 に答える