mysql - 在 MySQL 的 JOIN 上设置 LIMIT

标签 mysql sql join

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

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";

在那之前使用临时表或 View 会更优雅,但我选择坚持使用常规 sql。

fiddle :http://sqlfiddle.com/#!2/2820b/17

关于mysql - 在 MySQL 的 JOIN 上设置 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19969503/

相关文章:

sql - 匹配来自两个表的行数不相等的数据

sql - 将列值加一

python - 带有外连接的 sqlalchemy 中的 Order_by

php - MySQL 连接两个表的多条记录

mysql - 将 Rollup 与 ORDER BY 结合使用时出现的问题

MySql查询: Show Columns as Rows from 1 table

mysql - 开启 Apache Basic Auth 导致服务器连接失败

sql - 将一个选择结果除以另一个选择结果

java - 使用数据库创建企业桌面应用程序的最佳实践

php.ini 增加 upload_max_file debian 服务器 putty