编写存储过程,在MySQL中以逗号分隔的字段标记重复值

时间:2016-08-15 18:59:35

标签: mysql sql

我有一个像这样的数据库表:

ID   THINGS            HAS_DUPLICATES
1    AAA, BBB, AAA     NULL
2    CCC, DDD          NULL

我正在尝试编写一个存储过程来标记THINGS字段中的重复值。 在调用该过程后,该表将变为如下:

ID   THINGS            HAS_DUPLICATES
1    AAA, BBB, AAA     YES
2    CCC, DDD          NO

请注意,我正在尝试仅使用SQL解决此问题而不对数据库进行规范化。我也知道其他方法,比如编写PHP代码。

1 个答案:

答案 0 :(得分:0)

以下是我的问题的答案,假设THINGS字段中的数据由条形'|'分隔。我们的原始表将是myTABLE:

ID   THINGS            THINGSCount  THINGSCountUnique   HAS_DUPLICATES
1    AAA|BBB|AAA       NULL         NULL                NULL
2    CCC|DDD           NULL         NULL                NULL

步骤1.检查由条形'|'分隔的最大值数在THINGS领域:

SELECT ROUND((CHAR_LENGTH(THINGS) - CHAR_LENGTH(REPLACE(THINGS,'|',''))) / CHAR_LENGTH('|')) + 1 FROM myTABLE;

步骤2.假设步骤1中的答案为7,现在使用以下SQL将THINGS字段中的数据拆分为行,还有许多其他方法可供Google进行拆分:

CREATE TABLE myTABLE_temp 
SELECT ID, SUBSTRING_INDEX(SUBSTRING_INDEX(myTABLE.THINGS, '|', n.n), '|', -1) THINGS 
FROM myTABLE JOIN 
( SELECT n FROM 
( SELECT 1 AS N UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 ) a ) n 
ON CHAR_LENGTH(THINGS) - CHAR_LENGTH(REPLACE(THINGS, '|', '')) >= n - 1 
ORDER BY ID;

我们的myTABLE_temp表格如下:

ID   THINGS
1    AAA
1    BBB
1    AAA
2    CCC
2    DDD

第3步。在这里,我们创建两个新表来保存COUNT(THINGS)和COUNT(DISTINCT THINGS),如下所示:

# THINGSCount
CREATE TABLE myTABLE_temp_2 
SELECT ID, COUNT(THINGS) AS THINGSCount FROM myTABLE_temp GROUP BY ID;
# Remember to ADD INDEX to ID field
UPDATE myTABLE A INNER JOIN myTABLE_temp_2 B ON(A.ID = B.ID) SET A.THINGSCount = B.THINGSCount;

# THINGSCountUnique
CREATE TABLE myTABLE_temp_3 
SELECT ID, COUNT(THINGS) AS THINGSCountUnique FROM myTABLE_temp GROUP BY ID;
# Remember to ADD INDEX to ID field
UPDATE myTABLE A INNER JOIN myTABLE_temp_3 B ON(A.ID = B.ID) SET A.THINGSCountUnique = B.THINGSCountUnique;

最终步骤:标记重复值:

UPDATE myTABLE SET HAS_DUPLICATES = IF(THINGSCount>THINGSCountUnique, 'DUPLICATES', 'NO');