1

2 レベルのナビゲーションを生成するために、次のクエリを作成しました。レベル 1 - カテゴリ レベル 2 - サブカテゴリ

Ex. category - Year<br />
subcategories - 2013, 2012, 2011, 2010, 2009

次のようになります。

$query = "
   SELECT categories.Category, categories.idCat, subcategories.subCategory, subcategories.idSub       
   FROM 
      categories 
   JOIN 
      cat_sub ON categories.idCat = cat_sub.idCat
   JOIN 
      subcategories ON subcategories.idSub = cat_sub.idSub
   ORDER BY 
      categories.idCat DESC,subcategories.idSub DESC";

テーブルは次のようになります。

categories(idCat, Category)

subcategories(idSub,  subCategory)

cat_sub(idCat,  idSub)

カテゴリを無制限に保ちながら、サブカテゴリの数を 3 つに制限したいと考えています。どんな助けでも大歓迎です!

元。
表示カテゴリのみ- 年
のサブカテゴリ - 2013、2012、2011

物事をもう少し明確にしたことを願っています。

ありがとう、アレクス

4

2 に答える 2

1

これはトリッキーですが、いくつかのユーザー変数を使用して解決できます。

$query = "
SELECT
    c.Category,
    c.idCat,
    s.subCategory,
    s.idSub
FROM
    categories c 
        JOIN cat_sub cs ON c.idCat = cs.idCat
        JOIN (
            SELECT 
                IF(@C != c.Category, @ROWNUM := 1, @ROWNUM := @ROWNUM +1) AS RN,
                @C := c.Category,
                c.idCat,
                s.idSub,
                s.subCategory
            FROM categories c 
                JOIN cat_sub cs ON c.idCat = cs.idCat
                JOIN subcategories s ON s.idSub = cs.idSub
                CROSS JOIN (SELECT @C := '') t2
            ORDER BY c.idCat DESC, s.idSub DESC
        ) s ON s.idSub = cs.idSub AND cs.idCat = s.idCat
        JOIN (
            SELECT idCat, MAX(rn) AS mx
            FROM (
                SELECT 
                    IF(@C != c.Category, @ROWNUM := 1, @ROWNUM := @ROWNUM +1) AS rn,
                    @C := c.Category,
                    c.idCat
                FROM categories c 
                    JOIN cat_sub cs ON c.idCat = cs.idCat
                    JOIN subcategories s ON s.idSub = cs.idSub
                    CROSS JOIN (SELECT @C := '') t2
                ORDER BY c.idCat DESC, s.idSub DESC
            ) t
            GROUP BY idCat
        ) maxcat ON maxcat.idCat = c.idCat AND s.rn BETWEEN maxcat.mx-2 AND maxcat.mx
ORDER BY c.idCat DESC, s.idSub DESC";

その前に一時テーブルまたはビューを使用するとよりエレガントになりますが、通常の SQL に固執することにしました。

フィドル: http://sqlfiddle.com/#!2/2820b/17

于 2013-11-14T05:10:31.103 に答える