我的表格包含以下结构和测试记录:
+--------+--------+---------+
| vid | number | name |
+--------+--------+---------+
| 2 | 012345 | name1 | r1
| 6 | 0012345| 1name | r2
| 5 | 012345 | namee | r3
| 6 | 9111522| name6 | r4
| 3 | 999999 | name65 | r5
| 2 | 0999999| name64 | r6
+--------+--------+---------+
行r1,r2和r3是重复的,因为12345在字段编号内部,r5和r6是重复的。 我想在此表中显示重复的行。
我必须创建什么查询才能获得此结果?
提前致谢!
答案 0 :(得分: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
答案 1 :(得分:1)
尝试以下查询,但不限制您使用特定模式。在Michaels中添加regexp,回答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
<强>更新强> 通过将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