0

我有一个包含名称列表的数据库表,并关联了按位值,我可以创建一个没有任何实际问题的 php 数组,但我需要能够用另一个查询检查它映射到数组中的哪个结果条件,然后显示关联的名称。

条件按位表

$DBH = new PDO("dblib:host=$myServer;dbname=$SystemDB", $myUser, $myPass);
$DBH1 = new PDO("dblib:host=$myServer;dbname=$TaxiHistoryDB", $myUser, $myPass);


$sth = $DBH->prepare("SELECT dbo.Conditions.Name, dbo.Conditions.ConditionValue     
                      FROM dbo.Conditions 
                      WHERE dbo.Conditions.ConditionID > 0");
$sth->execute();

$ConditionsArray = $sth->fetchAll();

$STH1 = $DBH1->query("SELECT dbo.tblBooking.Conditions 
                      FROM dbo.tblBooking  
                      WHERE dbo.tblBooking.BookingID = '36607762'");

$STH1->setFetchMode(PDO::FETCH_LAZY);

while($row1 = $STH1->fetch()){

$condition = $row1->Conditions;


}//end while

第一个查询给了我一个如下所示的结果:

Array ( [0] => Array ( [Name] => [0] => [ConditionValue] => 1 [1] => 1 ) 
[1] => Array ( [Name] => [0] => [ConditionValue] => 2 [1] => 2 ) 
[2] => Array ( [Name] => [0] => [ConditionValue] => 4 [1] => 4 ) 
[3] => Array ( [Name] => [0] => [ConditionValue] => 8 [1] => 8 ) 
[4] => Array ( [Name] => [0] => [ConditionValue] => 16 [1] => 16 ) 
[5] => Array ( [Name] => [0] => [ConditionValue] => 32 [1] => 32 ) 
[6] => Array ( [Name] => [0] => [ConditionValue] => 64 [1] => 64 ) 
[7] => Array ( [Name] => [0] => [ConditionValue] => 128 [1] => 128 ) 
[8] => Array ( [Name] => Exterior Hoist [0] => Exterior Hoist [ConditionValue] => 256 [1] => 256 ) 
[9] => Array ( [Name] => [0] => [ConditionValue] => 512 [1] => 512 ) 
[10] => Array ( [Name] => [0] => [ConditionValue] => 1024 [1] => 1024 ) 
[11] => Array ( [Name] => [0] => [ConditionValue] => 2048 [1] => 2048 ) 
[12] => Array ( [Name] => [0] => [ConditionValue] => 4096 [1] => 4096 ) 
[13] => Array ( [Name] => [0] => [ConditionValue] => 8192 [1] => 8192 ) 
[14] => Array ( [Name] => [0] => [ConditionValue] => 16384 [1] => 16384 ) 
[15] => Array ( [Name] => [0] => [ConditionValue] => 32768 [1] => 32768 ) 
[16] => Array ( [Name] => Parcel [0] => Parcel [ConditionValue] => 65536 [1] => 65536 ) 
[17] => Array ( [Name] => Cheques [0] => Cheques [ConditionValue] => 131072 [1] => 131072 )
[18] => Array ( [Name] => OuterArea [0] => OuterArea [ConditionValue] => 262144 [1] => 262144 ) 
[19] => Array ( [Name] => [0] => [ConditionValue] => 524288 [1] => 524288 ) 
[20] => Array ( [Name] => [0] => [ConditionValue] => 1048576 [1] => 1048576 ) 
[21] => Array ( [Name] => V [0] => V [ConditionValue] => 2097152 [1] => 2097152 )
[22] => Array ( [Name] => Wheelchair [0] => Wheelchair [ConditionValue] => 4194304 [1] => 4194304 ) 
[23] => Array ( [Name] => M50 [0] => M50 [ConditionValue] => 8388608 [1] => 8388608 ) 
[24] => Array ( [Name] => Executive Car (Silver) [0] => Executive Car (Silver) [ConditionValue] => 16777216 [1] => 16777216 ) 
[25] => Array ( [Name] => Two M50s [0] => Two M50s [ConditionValue] => 33554432 [1] => 33554432 ) 
[26] => Array ( [Name] => Special [0] => Special [ConditionValue] => 67108864 [1] => 67108864 ) 
[27] => Array ( [Name] => Animal [0] => Animal [ConditionValue] => 134217728 [1] => 134217728 ) 
[28] => Array ( [Name] => COD Parcel [0] => COD Parcel [ConditionValue] => 268435456 [1] => 268435456 ) 
[29] => Array ( [Name] => 9 seater [0] => 9 seater [ConditionValue] => 536870912 [1] => 536870912 ) 
[30] => Array ( [Name] => 6 seater [0] => 6 seater [ConditionValue] => 1073741824 [1] => 1073741824 ) 
[31] => Array ( [Name] => 7 seater [0] => 7 seater [ConditionValue] => 2147483648 [1] => 2147483648 ) 
[32] => Array ( [Name] => Wagon [0] => Wagon [ConditionValue] => 4294967296 [1] => 4294967296 ) 
[33] => Array ( [Name] => Maxi10str [0] => Maxi10str [ConditionValue] => 8589934592 [1] => 8589934592 ) 
[34] => Array ( [Name] => Bike [0] => Bike [ConditionValue] => 17179869184 [1] => 17179869184 ) 
[35] => Array ( [Name] => NonMaxi [0] => NonMaxi [ConditionValue] => 34359738368 [1] => 34359738368 ) 
[36] => Array ( [Name] => NonMaxiOrMulti [0] => NonMaxiOrMulti [ConditionValue] => 68719476736 [1] => 68719476736 ) 
[37] => Array ( [Name] => [0] => [ConditionValue] => 137438953472 [1] => 137438953472 ) 
[38] => Array ( [Name] => Towbar [0] => Towbar [ConditionValue] => 274877906944 [1] => 274877906944 ) 
[39] => Array ( [Name] => NO DISPATCH [0] => NO DISPATCH [ConditionValue] => 549755813888 [1] => 549755813888 ) )

我在这里和其他地方读过几篇文章,我了解按位运算的工作原理,但我对我会经历的语法或过程有点迷茫。本质上,一个工作编号将有 0 到 40 个与之相关的条件。

在while循环中使用以下代码

echo $row1->条件;

我得到:67108864

我知道代表“特殊”

我只是不确定如何将第二个查询的结果与第一个查询生成的数组进行比较。

谢谢。

4

1 回答 1

0

我猜你正在寻找类似的东西:

while($bookingRow = $STH1->fetch())
{    
    foreach($ConditionsArray as $codeRow)
    {
        if(($bookingRow->Conditions & $codeRow->ConditionValue) > 0)
        {
            printf('Matched Condition Name: %s', $bookingRow->Name);
        }
    }
}

但是您可能希望在第二个查询中至少选择一个附加列,以便知道tblBooking 表中的哪一行匹配。

此外,如果您的条件代码真的等于 2^ n,那么存储n会更有效率,而不是浪费所有这些位存储零。

数字 4294967296 需要 33 位。如果您改为存储n (=32),则只需要 6 个。

而且我猜如果预订有多个条件,那么它的值只是各种条件代码的总和,因为将多个 (2^ n ) 加在一起(对于不同的n)会给你一个整数值,你可以反转回条件代码。

但这违背了数据库的目的。如果你真的想要,你应该有 3 个表:一个 conditionCode 表(由一个简单的递增整数主键索引),一个 booking 表(索引类似),然后第三个表可能是“bookingCondition”,其中有一行每个预订的每个条件。

如果预订 1 有 2 个条件,预订 2 有 5 个,预订 3 有 1 个,那么您的“bookingCondition”表将有 8 行,看起来像

1个
1个
2℃
2天
2e
2楼
2克
3小时

其中字母 ah 实际上不是字母,而是整数,是对 conditionCode 表的主键的引用。

然后找出特定预订的条件就像一个简单的 SQL 语句(使用 JOIN)一样简单,而不是多个查询和 PHP“后处理”

于 2013-09-18T22:36:44.857 回答