繁体   English   中英

在MySQL中的JOIN上设置LIMIT

[英]Setting a LIMIT on a JOIN in MySQL

我创建了以下查询,以产生两级导航,第一级-类别第二级-子类别

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)

我想将子类别的数量限制为三个,同时保持类别不受限制。 任何帮助将非常感激!

防爆。 仅显示
类别-年
子类别-2013年,2012年,2011年

希望我把事情弄清楚一点。

谢谢,阿列克斯

这很棘手,但是我们可以使用一些用户变量来解决:

$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

使用派生表来限制联接的子类别。 像这样:

SELECT categories.Category, categories.idCat, T.subCategory, T.idSub       
   FROM 
      categories 
   JOIN 
      cat_sub ON categories.idCat = cat_sub.idCat
   JOIN 
      (SELECT * FROM subcategories s ORDER BY year DESC LIMIT 3) as T ON T.idSub = cat_sub.idSub 
   ORDER BY 
      categories.idCat DESC,T.idSub DESC";

注意:由于未提供表结构,因此未经测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM