Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 修改嵌套父过程代码以使用名称而不是ID_Mysql_Sql_Stored Procedures - Fatal编程技术网

Mysql 修改嵌套父过程代码以使用名称而不是ID

Mysql 修改嵌套父过程代码以使用名称而不是ID,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我发现了一个我寻找了几个月的宝藏,一个SQL过程,它将所有父类别都列到子类别中,以便生成面包屑或提供类别搜索建议。但它需要类别ID才能找到它的父项,我想修改它以使用类别名称,因为我正在制作一个搜索框,提供搜索建议以显示类别及其所有父项 代码来自 我的表格结构如下所示: +------------+-------------+-----------+ | website_id | name | parent_id | +------------+-------------+-----

我发现了一个我寻找了几个月的宝藏,一个SQL过程,它将所有父类别都列到子类别中,以便生成面包屑或提供类别搜索建议。但它需要类别ID才能找到它的父项,我想修改它以使用类别名称,因为我正在制作一个搜索框,提供搜索建议以显示类别及其所有父项

代码来自

我的表格结构如下所示:

+------------+-------------+-----------+
| website_id | name        | parent_id |
+------------+-------------+-----------+
| 1          | Electronics |         0 |
+------------+-------------+-----------+
| 2          | Computers   |         1 |
+------------+-------------+-----------+
| 3          | Asus        |         2 |
+------------+-------------+-----------+
| 4          | Food        |         0 |
+------------+-------------+-----------+
| 5          | Chicken     |         4 |
+------------+-------------+-----------+
我希望当用户搜索“华硕”时,我会得到一个显示“3-asus,2-Computers,1-Electronics”的表格结果,以便在下拉列表中显示“Electronics->Computers->asus”

现在,如果我使用:
调用getAllParentCategories(3,10)
,它的工作原理与预期一样,我希望它能像
调用getAllParentCategories('asus',10)
,但我的SQL知识对我没有帮助


谢谢您的帮助。

您想更改过程,使其接受类别名称而不是类别id作为第一个参数。过程的输出应保持不变

一种解决方案是在查询中添加一个额外步骤,从
nameCat
参数初始化
idCat
变量:

CREATE PROCEDURE `getAllParentCategories`( IN nameCat VARCHAR(255), IN intMaxDepth int)
BEGIN
    ...
    SET chrFullReturn = '';
    SELECT @param := website_id FROM sb_categories WHERE name = nameCat;
    set chrProcessed = concat('|',@param, '|');
    ...
代码的其余部分应该保持不变

请注意,只有在类别名称唯一的情况下,此功能才能正常工作。。。您可能需要在此列上创建唯一约束:

ALTER TABLE sb_categories ADD CONSTRAINT UC_name UNIQUE (name);

我感谢你的帮助。我刚刚将
(在nameCat int
中)更改为
(在nameCat VARCHAR(255)中)
@tinyCoder:欢迎!我也修复了答案中的数据类型。GMB,再次您好。您能提供一个解决方案来避免类别的唯一名称吗?我有很多相似的名称,但在不同的父类别下,我需要所有这些名称都显示出来,这可能吗?
ALTER TABLE sb_categories ADD CONSTRAINT UC_name UNIQUE (name);