php - 如何从MySQL数据库中选择同一列中包含超过3个所需单词的行?

标签 php mysql database

我有一个大型数据库(超过 200 万行),用于存储用户的统计信息。用户拥有包含部分(例如散列 MAC 地址)的唯一 ID。 唯一 ID 字符串示例为:

“AAAAAA-BBBBBB-CCCCCC-DDDDDD-EEEEEE-FFFFFFF”

有时唯一 ID 的一部分会发生变化,例如:

“ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX”

我想使用 PHP 来识别用户并选择所有行,其中至少有 3 个(或不同值)唯一 ID 部分匹配。有什么有用的语法可以用来做到这一点吗?我知道我可以选择包含至少 1 个唯一 ID 部分的所有行,然后通过“-”字符分解为数组,并检查是否包含至少 3 个相同的单词,但我相信这不是最快的方法。

基本上,我想使用类似的东西:

WHERE `UniqueID` REGEXP 'AAAAAA|BBBBBB|CCCCCC|DDDDDD|EEEEEE|FFFFFFF';

但仅当 6 个单词中有 3 个匹配时才选择。

最佳答案

您可能想检查性能

考虑这个查询,它使用 inStr 来检查 id 字符串中的字符串是否可用。我使用 substring_index 来提取部分。以防万一,如果您有兴趣拆分或提取部分 id 字符串来创建临时表,但对于这个答案,您可以忽略它。

理想情况下,您可以使用keyword1、keyword2和keyword3作为参数创建自己的存储过程,然后您就可以执行搜索并返回结果。

Where 条件检查是否在您的 ID 字符串中找到关键字 1、2 和 3。

select 
    'ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX' as Id,
    substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 1) as part1,
    substring_index(substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 2),'-', -1) as part2,
    substring_index(substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 3),'-', -1) as part3,
    substring_index(substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 4),'-', -1) as part4,
    substring_index(substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 5),'-', -1) as part5,
    substring_index(substring_index('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','-', 6),'-', -1) as part6
from dual
WHERE

    instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','BBBBBB') >= 1 -- keyword1
    and instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','CCCCCC') >= 1 -- keyword2
    and instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX','DDDDDD') >= 1 -- keyword3
;

编辑 如果上述查询有效,您可以添加您的逻辑。

select 
    'ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX' as Id


from dual
WHERE
    (
    -- below logic gives true when 3 or more keywords are found. change this accordingly
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik1) >0)+
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik2) >0)+
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik3) >0)+
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik4) >0)+
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik5) >0)+
        (instr('ZZZZZZ-BBBBBB-CCCCCC-DDDDDD-EEEEEE-XXXXXXX',ik6) >0)
    ) >=3

;

关于php - 如何从MySQL数据库中选择同一列中包含超过3个所需单词的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392319/

相关文章:

mysql - 在 mySQL 中将十六进制字符串转换为数字

database - Postgres 写/读锁

java - 当我们通过停止mssql数据库强制拦截批量执行时如何找到加载的记录的状态

mysql - Group By 子句不显示相同的行值?

php - 如何在没有 Composer 的情况下包含 phpspreadsheet 库?

php - 如何在 Woocommerce 的结帐页面上将应用优惠券输入移动到订单下方?

php - 识别 mysql 更改 php 中的语句 fetch 中的 "group by"字段值的最佳方法?

php - 通过 PHP 从站点重复检索数据

php - 存储用户 Twitter 关注者数据的最佳方式

mysql - 如何根据值将多行转换为多列