如何区分UNION查询中两个表的结果字段(catid与subcatid)
问题
需要从两个不同表中获取匹配指定字符串的数据行,当前SQL能返回正确数据,但结果的字段键始终沿用第一个表的命名,无法区分主分类(catid)和子分类(subcatid)的字段。
当前SQL语句:
SELECT categoriaid AS catid, categoria AS cat FROM $this->tcat WHERE categoria LIKE '%$search%' UNION SELECT subcategoriaid AS subcatid, subcategoria AS subcat FROM $this->tsubcat WHERE subcategoria LIKE '%$search%'
当前返回结果:
array(2) { [0]=> object(stdClass)#9484 (2) { ["catid"]=> string(1) "3" ["cat"]=> string(20) "Atención a Clientes" } [1]=> object(stdClass)#9483 (2) { ["catid"]=> string(1) "7" ["cat"]=> string(20) "Atención al cliente" } }
解决方案
方案1:统一字段结构+添加类型标记
给两个查询结果统一字段名,同时新增一个字段标记数据类型,既能保持结果结构一致,又能区分主/子分类:
SELECT categoriaid AS id, categoria AS name, 'category' AS data_type FROM $this->tcat WHERE categoria LIKE '%$search%' UNION SELECT subcategoriaid AS id, subcategoria AS name, 'subcategory' AS data_type FROM $this->tsubcat WHERE subcategoria LIKE '%$search%'
返回的每一行都会包含id(对应分类ID)、name(分类名称)和data_type(标记是主分类还是子分类),后续业务逻辑可以通过data_type判断数据来源。
方案2:保留所有目标字段,空值补NULL
如果必须保留catid、subcatid这类原始字段名,让两个SELECT语句都输出所有目标字段,不存在的字段用NULL填充:
SELECT categoriaid AS catid, categoria AS cat, NULL AS subcatid, NULL AS subcat FROM $this->tcat WHERE categoria LIKE '%$search%' UNION SELECT NULL AS catid, NULL AS cat, subcategoriaid AS subcatid, subcategoria AS subcat FROM $this->tsubcat WHERE subcategoria LIKE '%$search%'
这种方式下,主分类行的subcatid和subcat字段值为NULL,子分类行的catid和cat字段值为NULL,能清晰区分两类数据的字段归属。
内容的提问来源于stack exchange,提问作者Álvaro García
相关产品推荐
相关产品推荐

