如何编写MySQL存储函数实现多表ID合并用于IN查询统计?
你的写法不可行,我来拆解问题并给出正确实现
首先,你的代码存在几个MySQL语法和逻辑上的问题:
- MySQL没有原生数组类型:你直接写
declare ARRAY1;是语法错误,MySQL并不支持这种数组变量的声明方式。 - 结果集无法用加号合并:就算你能获取到category1和category2的id结果集,
ARRAY1+ARRAY2这种合并方式在MySQL里完全不成立,没有这样的语法来合并两个结果集。 - 未使用传入的
parent参数:你的函数定义了parent参数,但代码里完全没用到它,这应该是个疏忽——如果你的逻辑是要根据传入的父分类ID筛选子分类ID,这个参数得派上用场。
正确的实现方式
我们不需要用数组,直接在IN子句里通过UNION或UNION ALL合并两个表的ID结果即可,这是MySQL处理这类场景的标准做法:
情况1:需要用到parent参数(筛选指定父分类下的子ID)
假设category1和category2表都有parent_id字段用来关联父分类:
DROP FUNCTION IF EXISTS listing_count; CREATE FUNCTION listing_count(parent INT(11)) RETURNS INT(11) DETERMINISTIC BEGIN DECLARE count INT(11) DEFAULT 0; -- 用UNION ALL合并两个表的ID,再作为IN的条件 SET count = ( SELECT COUNT(*) FROM listing_category WHERE category IN ( SELECT id FROM category1 WHERE parent_id = parent UNION ALL SELECT id FROM category2 WHERE parent_id = parent ) ); RETURN count; END
情况2:不需要parent参数(直接取所有分类ID)
如果你的需求是统计所有category1和category2的ID对应的记录数:
DROP FUNCTION IF EXISTS listing_count; CREATE FUNCTION listing_count() RETURNS INT(11) DETERMINISTIC BEGIN DECLARE count INT(11) DEFAULT 0; SET count = ( SELECT COUNT(*) FROM listing_category WHERE category IN ( SELECT id FROM category1 UNION ALL SELECT id FROM category2 ) ); RETURN count; END
额外说明
UNIONvsUNION ALL:UNION ALL会保留两个表中重复的ID,执行效率更高;如果你的场景需要去重ID(比如category1和category2可能有相同ID),就把UNION ALL换成UNION。- 如果你原来的
parent参数有其他用途(比如不是关联parent_id),可以根据实际需求调整子查询里的筛选条件。
内容的提问来源于stack exchange,提问作者Maciek
相关产品推荐
相关产品推荐

