mysql - 如何一次查询出某一字段相同的全部数据
大家讲道理
大家讲道理 2017-04-17 15:31:19
[MySQL讨论组]
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(4)
PHP中文网

假设你的表名是user:

select * from user where name in (select name from user group by name having count(1) > 1);
迷茫

select * from user group by (...) having count(*) > 1就足够了,不需要再用in。
其实高效什么的你真的想太多了,这属于设计失误,花时间修复一次然后修改表结构防止此类问题再次发生才是正根。

另外这个表没有id,所以你也不能自动删除重复的数据,因为写不出条件,只能再用中间表去倒。

综上,别考虑效率了,手工改正就好。

阿神
SELECT * FROM user AS a
WHERE EXISTS (
SELECT 1 FROM user AS b
WHERE a.name = b.name
GROUP BY name
HAVING COUNT(1) > 1
)

由于涉及到全表GROUP BY,所以性能比较低。
如果可以修改表结构的话,建议增加一个字段表示该用户名称是否重名,该字段在写入数据的时候就可以判断维护了。

PHP中文网

数据库的世界没有魔法,索引之所以能加快搜索速度就是因为它预先处理了,用延长每次插入更新数据的时间来加快搜索速度,都是有代价的。

回到这个问题,你可以在name上加索引,这样group by就能更高效一点,但是根据你的需求还是要子查询。

不过在name上加索引我觉得不是个健康的做法。如果是我,解决这个问题会做一个定时任务:扫描重名的用户,把ID记录在某个表A上。然后页面上显示时直接把表A拿出来关联用户表即可。之所以这样做还有一个原因就是这个工作并非要做到很严格,和实际有点误差是无妨的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号