我有一个大型数据库(超过 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/