mysql - 计算每个条目的 LIKE 匹配数

标签 mysql string match

我试着用一个简单的例子来解释我所说的匹配的意思:

我有一个像这样的表myprods:

id | name
1    galaxy s4 mini
2    samsung galaxy s4
3    galaxy galaxy s3
4    iphone 4s
5    apple iphone 4s

到目前为止我有这个查询:

SELECT *
FROM   myprods
WHERE  name LIKE "%samsung%" OR name LIKE "%galaxy%" OR name LIKE "%s4%"

我的查询结果是:

id | name
1    galaxy s4 mini
2    galaxy s4
3    galaxy galaxy s3

现在我不仅会返回匹配的行,还会返回命中数。如果 LIKE 短语之一适用于该行,则将是一次命中。所以在这种情况下,我希望命中为 0、1、2 或 3。这意味着:LIKE 短语 "%galaxy%" 不应计为 id=3 的两次命中,它只是算作“命中”或“未命中”。

现在的预期结果是:

id | name               | hits
1    galaxy s4 mini       2
2    samsung galaxy s4    3
3    galaxy galaxy s3     1

可能在高性能的 mysql 语句中? 或者我应该只选择上面查询的行,然后通过 PHP 中的 strpos 将单个子字符串与返回的名称匹配?

最佳答案

在 MySQL 中, bool 表达式可以用作整数——0 表示假,1 表示真。因此,以下工作:

SELECT p.*,
       ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits
FROM   myprods p
WHERE  name LIKE '%samsung%' OR name LIKE '%galaxy%' OR name LIKE '%s4%';

编辑:

如果是 MySQL,您还可以将此查询表示为:

SELECT p.*,
       ((name LIKE '%samsung%') + (name LIKE '%galaxy%') + (name LIKE '%s4%')) as hits
FROM   myprods p
HAVING hits > 0;

在此上下文中使用 having 是一个 SQL 扩展,在其他数据库中不起作用。但是,它确实允许查询引用用于过滤的列别名,而无需使用子查询。

关于mysql - 计算每个条目的 LIKE 匹配数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23153515/

相关文章:

java检查第一个和最后一个字符是否大写

r - 使用 data.table 时没有匹配的 %in%

mysql - 无法从 docker 容器内连接到 mysql

MYSQL TINYBLOB 与 LONGBLOB

Delphi:如何根据(动态)掩码将字符串动态 "split"转换为子字符串

javascript - [Javascript]正则表达式

javascript正则表达式匹配

c# - 使用 Regex.Match 静态方法查找从特定位置开始的匹配项

php - 如果ATTR_EMULATE_PREPARES为false,则Prepared Insert不会执行任何操作

php - 循环遍历动态 mysql 数据数组时遇到问题