这个问题在这里已经有答案了:
如何创建mysql分层递归查询(15个答案)
两年前关门了。
我有一个名为collections的mysql表,当作为一个表来查看和实现时,可以是这样的:
我需要知道一个mysql查询是否能够获得一个集合类型项(给定项)下的所有产品,该项下可能有集合。例如,如果我选择10,它应该返回14、12、13和15。
我实现了一个涉及do..while循环的解决方案。。。
$concatted = 10;
$products = [];
do {
$sql = "SELECT id, type FROM collections WHERE parent IN ($id_concatted)";
$result = $mysqli->query($sql);
if($result) {
while($row = $result->fetch_object()){
if($row->type == 'product') {
apply_changes_to_product($row->id);
} elseif ($row->type=='collection'){
$collections[] = $row->id;
}
}
}
if(count($collections) > 0){
$id_concatted = implode($collections, ",");
$continue = true;
$collections = [];
} else {
$continue = false;
}
} while ($continue);
我认为上面的代码效率不高。我认为这是可行的一个问题,但我不知道如何。
更新:我将此标记为如何创建mysql分层递归查询的副本,尽管在那篇文章中没有可接受的解决方案。我得到这个解决方案是基于一个回复(mysql 5.6):
SELECT id, `type` FROM (
select id, `type`
from (select * from collections
order by parent, id) products_sorted,
(select @pv := '10') initialisation
where find_in_set(parent, @pv)
and length(@pv := concat(@pv, ',', id))
) products
WHERE
products.`type` = 'product'
小提琴是http://sqlfiddle.com/#!9/ea214f/2。
1条答案
按热度按时间dauxcl2d1#
是的,您可能需要使用子查询并首先获取id,其中parent=selectedid,type=collection,然后选择id,其中parent在子查询id和type=product中
如下所示:
对于多层,使用mysql的递归特性。如下所示: