2012-03-22 50 views
0

我有表以下结构和测试记录:如何使用MySQL“LIKE”显示重复行?

+--------+--------+---------+ 
| vid | number | name | 
+--------+--------+---------+ 
| 2  || name1 | r1 
| 6  | 0| 1name | r2 
| 5  || namee | r3 
| 6  | 9111522| name6 | r4 
| 3  | 999999 | name65 | r5 
| 2  | 0999999| name64 | r6 
+--------+--------+---------+ 

的行R1,R2和R3是重复的,因为12345是内部的场数和R5和R6是重复的。 我想显示此表中的重复行。

我必须创建什么查询才能获得此结果?

在此先感谢!

回答

2

它看起来像你存储你的“号码”一栏为一个字符串(VARCHAR)。如果是这种情况,我强烈建议您将其切换到INT列类型。如果这是不可能的,那么我会确保你的应用程序正常化数据,所以字符串格式的数字总是以相同的格式。它会让生活变得更容易。

反正在的存在,假设一个重复的表示数据的术语“数据的数字表示是相同的”,那么这将工作

SELECT 
    t1.vid, t1.number, t1.name 
FROM table t1 
    INNER JOIN table t2 
    ON CAST(t1.number AS SIGNED)=CAST(t2.number AS SIGNED) AND t1.vid!=t2.vid 
GROUP BY t1.vid 
+0

这是比我的更完整,更好的答案。 – RumpRanger 2012-03-22 14:19:28

1

请尝试下面的查询,它不会将您限制为特定模式。将Michaels中的正则表达式添加到WHERE子句中,以便按模式进行分组。

SELECT 
    t1.id, t1.number, t1.name 
FROM table t1 
LEFT OUTER JOIN table t2 
ON t1.number LIKE CONCAT('%', t2.number, '%') 
GROUP BY t1.id 
HAVING COUNT(*) > 1 

UPDATE 通过添加CAST签署功能上面的查询,我们可以得到所有领先的0条目中删除。

SELECT 
    t1.id, t1.number, t1.name 
FROM table t1 
LEFT OUTER JOIN table t2 
ON t1.number LIKE CONCAT('%', CAST(t2.number AS SIGNED), '%') 
GROUP BY t1.id 
HAVING COUNT(*) > 1 

下面是MYSQL的小提琴链接展示样本数据查询:http://sqlfiddle.com/#!2/4deee/2