一种将一条记录拆分为多条记录的方法:MySQL FIND_IN_SET()函数的用法

          如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。简单的说,就是每一个列(属性),不能再分割成多个列(属性)。

——数据库第一范式       

尽管关系型数据库第一范式对一个属性不可拆分的特性进行了明确规定,但在业务场景中,常常因为这样那样的原因导致数据库设计违反了第一范式。

比如:


上图中,一个字段存储了两种房型。当我们需要对各个房型分组汇总的时候,会导致分组类型多种多样,不能按照每一类房型进行汇总。也即下图的样子:


这种混乱的情况,显然是不符合我们的需求的。

我们可以发现,房型的类别是可以枚举的:'一居' 、'两居'、'三居'、'四居'、'五居'、'五居以上'。那么我们是不是就可以将所有类别的房型进行一个汇总,使用FIND_IN_SET()函数来拆分原来的属性列呢?

答案是肯定的!

废话少说,直接上码:

SELECT b.name 意向房型, COUNT(*)num
FROM sell_custom_archives a,
(SELECT '一居' NAME UNION SELECT'两居'UNION SELECT'三居'UNION SELECT'四居'UNION SELECT'五居'UNION SELECT'五居以上')b
WHERE FIND_IN_SET(b.name,a.`intend_house_type`)
GROUP BY b.name

得出的查询结果如下图:


看看,是不是很整齐!完美拆分原有的属性列。

上述代码中:

(SELECT '一居' NAME UNION SELECT'两居'UNION SELECT'三居'UNION SELECT'四居'UNION SELECT'五居'UNION SELECT'五居以上')
是为了将几种属性值枚举出来,统一作为一个子查询结果。如果你的业务中,所有类别都集中存放在某个表中,则可以直接从那张表提取这些类型的数据,更为便捷。

猜你喜欢

转载自blog.csdn.net/oyezhou/article/details/81013306