[英]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.