1

そこで、MySQL を使用し、ネストされたセット/修正済みプレオーダー ツリー トラバーサル モデルに基づくカテゴリ構造を、次category_idのフィールドを持つ「nested_category」というテーブル名に格納しています 。namelftrgtpublished

published1 または 0 のいずれかです... 1 の場合、カテゴリはライブ サイトに表示されます。0 の場合、ライブ サイトに表示されません。さらに重要なことに、その未公開カテゴリの子もライブ サイトに表示されません。

published=1を持つすべてのカテゴリをリストし、 を持つカテゴリの子孫であるすべてのカテゴリを無視するクエリを書くのに問題がありますpublished=0

現時点で私は使用しています:

SELECT category_id, lft, rgt FROM nested_category WHERE published = 1

親が「非公開」のときに「子」カテゴリを無視する方法が本当にわかりません。

product_idまた、これをフィールドnameを持つ「new_products」テーブルにリンクしようとしています。私はここまで来ました:stockpricecategory_idpublished=1

select @myRight := rgt, @myLeft := lft 
from nested_category where name="ELECTRONICS";

select productId, productName, new_products.category_id, 
price, stock, new_products.published 
from new_products 
inner join ( 
    select category_id, lft, rgt from nested_category 
    where published = 1
) cat 
on new_products.category_id = cat.category_id 
and cat.lft >= @myLeft 
and cat.rgt <= @myRight 
and new_products.published = 1 
order by productName asc

上記のクエリは最初のクエリを使用しているため、「未公開」のカテゴリや製品は返されませんが、「公開済み」カテゴリが「未公開」カテゴリの子孫である場合は考慮されません。これが理にかなっていることを願っています!

4

2 に答える 2

1

ノードの深さで少し改善されました:

SELECT node.name, node.category_id, node.lft, node.rgt, (COUNT(parent.name) - 1) AS depth
FROM nested_category as node
LEFT JOIN (
    SELECT nested_category.category_id, nested_category.lft, nested_category.rgt 
    FROM nested_category, (
        SELECT category_id, lft, rgt 
        FROM nested_category 
        WHERE published = 0
    ) notNodeCat 
    WHERE nested_category.lft >= notNodeCat.lft 
    AND nested_category.rgt <= notNodeCat.rgt ) notNodeCat2
ON notNodeCat2.category_id=node.category_id,
nested_category as parent
LEFT JOIN (
    SELECT nested_category.category_id, nested_category.lft, nested_category.rgt 
    FROM nested_category, (
        SELECT category_id, lft, rgt 
        FROM nested_category 
        WHERE published = 0
    ) notParentCat 
    WHERE nested_category.lft >= notParentCat.lft 
    AND nested_category.rgt <= notParentCat.rgt ) notParentCat2
ON notParentCat2.category_id=parent.category_id            
WHERE notNodeCat2.category_id IS NULL AND notParentCat2.category_id IS NULL AND node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft ASC
于 2011-04-28T13:26:11.577 に答える
0

さて、たくさん遊んだ後、私はうまくいっている何かを一緒にハックしました...

SELECT nested_category.name, nested_category.category_id, nested_category.lft, nested_category.rgt 
FROM nested_category 
LEFT JOIN (
    SELECT nested_category.category_id, nested_category.lft, nested_category.rgt 
    FROM nested_category, (
        SELECT category_id, lft, rgt 
        FROM nested_category 
        WHERE published = 0
    ) notCat 
    WHERE nested_category.lft >= notCat.lft 
    AND nested_category.rgt <= notCat.rgt ) notCat2
ON notCat2.category_id=nested_category.category_id 
WHERE notCat2.category_id IS NULL
ORDER BY nested_category.lft ASC

published=1親によってブロックされていないすべてのnested_categoryアイテムが表示されますpublished=0

私が助けを必要としているのは、より効率的だと聞いているので、より多くの左結合を使用して書き直すことです!

于 2011-03-23T22:30:01.847 に答える