php - 获取给定集合下的所有产品

标签 php mysql

<分区>

当查看和实现时,我有一个名为集合的 MYSQL 表可能是这样的:

enter image description here

我需要知道一个 mysql 查询是否能够获取 collection 类型条目(给定)下的所有产品,该条目下可能有集合。例如,如果我选择 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);

我认为上面的代码效率不高。我认为它可以通过一个查询实现,但我不知道如何实现。

更新:我将其标记为 How to create a MySQL hierarchical recursive query 的副本尽管在那篇文章中没有公认的解决方案。我根据那里的一个回复(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'

fiddle 是http://sqlfiddle.com/#!9/ea214f/2 .

最佳答案

是的,您可能需要使用子查询并首先获取 id where parent = selectedId and type = 'collection' 然后选择 id where parent in the subquery id and type = 'product'

如下所示:

  SELECT id, type FROM collections WHERE parent IN (select id from collections where 
  parent = $id_concatted and type = 'collection') and type = 'product'

对于多级,使用 MySql 的递归特性。如下所示:

WITH RECURSIVE COLLECTIONS_PRODUCTS (ID, TYPE, PATH)
AS
(
SELECT ID, TYPE, CAST(ID AS CHAR(200))
FROM COLLECTIONS
WHERE PARENT IN ($id_concatted)
UNION ALL
SELECT S.ID, S.TYPE, CONCAT(M.PATH, ",", S.ID)
FROM COLLECTIONS_PRODUCTS M JOIN COLLECTIONS S ON M.ID=S.PARENT
)
SELECT * FROM COLLECTIONS_PRODUCTS WHERE TYPE = 'product' ORDER BY PATH;

关于php - 获取给定集合下的所有产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856263/

相关文章:

php - 我可以使用同一张表以不同方式/以更 Cake 的方式重构我的多个用户类型的设置吗?

mysql - 如何平均行?

php - 检查电子邮件是唯一的 php

mysql - 连接表时如何使用案例条件

php - SQLSRV PHP for SQL Server 不是有效的 Win32 应用程序

javascript - 银纹 + 无限 Ajax 卷轴 : None Left keeps being added to page

mysql - 如何在 Perl CGI 中使用持久的 MySQL 数据库连接

php - 使用电子邮件中的链接从数据库中安全删除条目

php - 转义对象中的所有数据

php - 如何在 <?php ?> 中编写 html 代码,我想在 PHP 脚本中编写 html 代码,以便它可以从后端回显