0

次のようなさまざまな「マスク」で満たされたテーブルがあります。

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

そして基本的に、データベースにクエリを実行し、特定のクエリが一致するかどうかを確認したいと思います。たとえば、a00-111-12です。f

があるところならどこでも(これはすべて 16 進数です) 一致があると言いたいです。したがって、値a00-111-12を取得すると、行 0 と 1 に一致する必要がありますが、2 と 3 には一致しないはずです。行 0 にはすべてのfが表示されるため、値を AND 演算すると同じ値になります。ただし、行 2 でテストすると、Mask3 列の値 92 を 12 で AND すると 12 になるため、AND は機能しませんが、その行を一致させたくないのです。

これは難しい質問だと思います。いくつかの MySQL クエリでは不可能かもしれませんが、テーブル全体を PHP にインポートして、そこから正しい行を見つけることは避けたいと思います。

クエリのアイデアは次のようになります。


    SELECT * FROM TABLE WHERE Mask1 = a00 AND Mask2 = 111 AND ...
    
ただし、Mask1、2、3、またはクエリに送信される値に対して何らかの操作を行う必要があります。

最終的な目標は、一致する行からTypeを取得することです。さらに情報が必要な場合は、お問い合わせください。

4

2 に答える 2

0

作業を容易にするサブマスク テーブルを作成し、1 行追加します

 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これが機能する方法は、z2とビットごとの AND を実行して個々の 16 進数を比較し、z2それぞれ 3 桁を取得することです。

それで

  • <any value> & z1最後の 16 進数を除くすべての 16 進数を 0 に設定します。つまり0x1230x003
  • <any value> & z2最後から 2 番目を除くすべての 16 進数を 0 に設定します。つまり0x1230x020
  • <any value> & z3最後から 3 番目を除くすべての 16 進数を 0 に設定します。つまり0x1230x100

このフィルターを使用すると、各桁のテストを次のように構築できます。

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

z1z2and z3(つまり0x00f0x0f0、 and )のそれぞれについてテストを繰り返し、0xf00結果を and 条件と組み合わせて、マスクの 3 つの 16 進数すべてがfテスト値または正確にテスト値であることを確認できます。

次に、これが Mask2 と Mask3 に対して繰り返されます (ただし、Mask3 が 2 桁であるため、z1、z2 のみ)。

submasks テーブルで内部結合を使用すると、マスク条件が true である Table からの値のみが結果に含まれます。

UPDATE - 2 つのマスクがテーブル内の 1 つの行に一致するかのように実行するselect distinct代わりに、 2 つの結果が返される場合があります。select

于 2013-06-27T17:37:47.880 に答える