如何用SELECT语句筛选Text含非自身姓名的COMMENTS表记录?
实现方案
完全可以通过SELECT语句实现这个需求,以下是两种实用的写法:
方法一:使用EXISTS子查询(推荐)
这种方式逻辑清晰,性能也比较好,适合大多数场景:
SELECT c.* FROM COMMENTS c WHERE EXISTS ( SELECT 1 FROM NAMES n WHERE n.`First Name` != c.`First Name` AND c.Text LIKE CONCAT('%', n.`First Name`, '%') );
逻辑说明
遍历COMMENTS表的每一行,子查询会检查NAMES表中是否存在不等于当前行First Name的姓名,且该姓名出现在当前行的Text字段里。只要存在符合条件的姓名,就会返回这行COMMENTS数据。
方法二:去重优化版(针对NAMES表有大量重复的情况)
如果NAMES表重复姓名很多,可以给子查询加DISTINCT减少重复判断,提升性能:
SELECT c.* FROM COMMENTS c WHERE EXISTS ( SELECT DISTINCT n.`First Name` FROM NAMES n WHERE n.`First Name` != c.`First Name` AND c.Text LIKE CONCAT('%', n.`First Name`, '%') );
注意事项
如果你的姓名里包含%、_这类LIKE语句的特殊通配符,需要用ESCAPE子句转义,比如:
AND c.Text LIKE CONCAT('%', REPLACE(REPLACE(n.`First Name`, '%', '\%'), '_', '\_'), '%') ESCAPE '\'
内容的提问来源于stack exchange,提问作者JamieS
相关产品推荐
相关产品推荐

