gpt4 book ai didi

MySql 查询掩码表

转载 作者:行者123 更新时间:2023-11-30 01:31:54 24 4
gpt4 key购买 nike

我有一张 table ,里面装满了各种“面具”,例如:

Type    Mask1    Mask2    Mask3
0 fff fff ff
1 aff fff ff
2 aff fff 92
3 001 fff 00

基本上,我想查询数据库并查看特定查询是否匹配,例如 a00-111-12

任何有 f< 的地方/b> (这都是十六进制)我想说有一个匹配。

所以我取值a00-111-12,它应该与第0行和第1行匹配,但不与第2行和第3行匹配,因为在第0行中,所有f 出现,因此与它们进行“与”操作将得到相同的值。但是,AND-ing 不起作用,因为如果使用第 2 行进行测试,Mask3 列值 92 AND 与 12 结果为 12,但我不希望该行匹配。

我发现这是一个很难问的问题,可能无法通过一些 MySQL 查询来实现,但我想避免将整个表导入 PHP,然后从那里找到正确的行。

查询的想法是:


SELECT * FROM TABLE WHERE Mask1 = a00 AND Mask2 = 111 AND ...
但是,需要对 Mask1、2、3 或发送到查询的值执行一些操作。

最终目标是从匹配行中获取类型。如果您需要更多信息,请询问。

最佳答案

创建子掩码表以使您的工作更轻松,添加一行

 z1 :  z2  : z3
0xf : 0xf0 : 0xf00

然后使用以下查询

   Select 
t.*
from Table t
inner join submasks s
on (
((t.Mask1 & s.z1) = s.z1 || (t.Mask1 & s.z1) = (a00 & s.z1)) &&
((t.Mask1 & s.z2) = s.z2 || (t.Mask1 & s.z2) = (a00 & s.z2)) &&
((t.Mask1 & s.z2) = s.z2 || (t.Mask1 & s.z2) = (a00 & s.z2)) &&
((t.Mask2 & s.z1) = s.z1 || (t.Mask2 & s.z1) = (111 & s.z1)) &&
((t.Mask2 & s.z2) = s.z2 || (t.Mask2 & s.z2) = (111 & s.z2)) &&
((t.Mask2 & s.z2) = s.z2 || (t.Mask2 & s.z2) = (111 & s.z2)) &&
((t.Mask3 & s.z1) = s.z1 || (t.Mask3 & s.z1) = (12 & s.z1)) &&
((t.Mask3 & s.z2) = s.z2 || (t.Mask3 & s.z2) = (12 & s.z2))
)

其工作方式是通过与 z1 执行按位 AND 来比较各个十六进制数字。 , z2z2分别获取 3 位数字中的每一位。

所以

  • <any value> & z1将除最后一位之外的所有十六进制数字设置为 0,即 0x123变成0x003
  • <any value> & z2将除倒数第二个之外的所有十六进制数字设置为 0,即 0x123变成0x020
  • <any value> & z3将除倒数第三个之外的所有十六进制数字设置为 0,即 0x123变成0x100

使用此过滤器,每个数字的测试可以构建为

((mask & filter) = filter)          // is the digit f
|| // OR
((mask & filter) = (test & filter)) // is the digit the same.

z1 中的每个重复测试, z2z3 (即 0x00f0x0f00xf00 )将结果与 and 条件结合起来,您可以检查掩码的所有 3 个十六进制数字是 f或确切的测试值。

然后对 Mask2 和 Mask3 重复此操作(但只有 z1,z2,因为 Mask3 是 2 位数字)。

通过对子掩码表使用内连接,结果将仅包含掩码条件为真的表中的值。

更新 - 您可能想要执行select distinct而不仅仅是select就好像两个掩码匹配表中的一行,那么将返回 2 个结果。

关于MySql 查询掩码表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17349156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com