我有一个表product_category
,其中包含字段id
,name
,parent_id
和level
。
例如, Agriculture 类别包含 id = 75
, level = 1
和parent_id = NULL
。子类别玉米,小麦, Rye 等具有 level = 2
和 {{ 1}}
在我的网站中,我想显示顶级类别,并且每个类别下方只显示5个子类别。但是进行查询以检索它们比我想象的更难。
如果我执行以下查询:
parent_id = 75
我检索所有顶级类别和子类别,但是有数千个子类别,因此当我只想要每个子类别中的前5个时,它会非常昂贵。
如果我执行以下操作:
SELECT a.name, a.parent_id FROM product_category a
WHERE (
SELECT b.level
FROM product_category b
WHERE b.id = a.parent_id
LIMIT 1
) = 1
仅检索5个子类别,而不是每个顶级类别的5个子类别。
然后我想到了以下方式:
SELECT a.name, a.parent_id FROM product_category a
WHERE (
SELECT b.level
FROM product_category b
WHERE b.id = a.parent_id
LIMIT 1
) = 1
LIMIT 5
它看起来非常脏和硬编码,但它是我现在能想到的唯一方式。还有其他解决办法吗?
谢谢!
答案 0 :(得分:3)
以下是每个根类别最多返回两个子类别的示例:
select parent.name as Category
, child.name as SubCategory
from (
select name
, parent_id
, @rn := if(@cur = parent_id, @rn+1, 1) as rn
, @cur := parent_id
from product_category pc
join (select @rn := 0, @cur := '') i
where level = 2
order by
parent_id
, id
) as child
join product_category as parent
on child.parent_id = parent.id
where child.rn < 3
答案 1 :(得分:2)
此解决方案按字母顺序排列子结果......
SELECT * FROM product_category;
+-----+---------------------+-----------+-------+
| id | name | parent_id | level |
+-----+---------------------+-----------+-------+
| 75 | Agriculture | NULL | 1 |
| 76 | Corn | 75 | 2 |
| 77 | Wheat | 75 | 2 |
| 78 | Rye | 75 | 2 |
| 85 | Vehicles | NULL | 1 |
| 86 | Cars | 85 | 1 |
| 87 | Planes | 85 | 1 |
| 88 | Trains | 85 | 1 |
| 95 | Painters | NULL | 1 |
| 96 | Surrealists | 95 | 2 |
| 97 | Impressionists | 95 | 2 |
| 98 | Post-Impressionists | 95 | 2 |
| 99 | Max Ernst | 96 | 3 |
| 100 | Claude Monet | 97 | 3 |
| 101 | Gauguin | 98 | 3 |
| 102 | Van Gogh | 98 | 3 |
+-----+---------------------+-----------+-------+
SELECT a.*
FROM
( SELECT x.*
, y.name subcategory
FROM product_category x
JOIN product_category y
ON y.parent_id = x.id
WHERE x.parent_id IS NULL
) a
JOIN
( SELECT x.*
, y.name subcategory
FROM product_category x
JOIN product_category y
ON y.parent_id = x.id
WHERE x.parent_id IS NULL
) b
ON b.id = a.id
AND b.subcategory <= a.subcategory
GROUP
BY a.id,a.subcategory
HAVING COUNT(*) <= 2;
+----+-------------+-----------+-------+---------------------+
| id | name | parent_id | level | subcategory |
+----+-------------+-----------+-------+---------------------+
| 75 | Agriculture | NULL | 1 | Corn |
| 75 | Agriculture | NULL | 1 | Rye |
| 85 | Vehicles | NULL | 1 | Cars |
| 85 | Vehicles | NULL | 1 | Planes |
| 95 | Painters | NULL | 1 | Impressionists |
| 95 | Painters | NULL | 1 | Post-Impressionists |
+----+-------------+-----------+-------+---------------------+