0

私のテーブルのレイアウトは次のとおりです。

`userid` INT unsigned NOT NULL,
`doors` INT unsigned NOT NULL,
PRIMARY KEY (`userid`)

doors選択以外の方法で MySQL ではなく PHP によって完全に使用されるビットマスクです。

いくつかの統計をまとめることに興味があるので、次の擬似コードのようなことをしたいと思いました:

for i between 0 and 24
    select count from table where doors&(1<<i)

これは PHP で簡単に実行できますが、すべての行を選択してマスクを手動で解析するか、25 の個別のカウント クエリを実行する必要があります。group byインスタンスを使用して、1つの選択クエリでこれを行う方法があるかどうか疑問に思っていました。

これは 1 回限りの使用であり、本番環境で使用するものではないことに注意してください

4

2 に答える 2

1

ここで、整数テーブルが役立ちます。次のように作成できます。

create table integers(i int unsigned not null);
insert into integers(i) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

次に、クエリを次のように実行できます

SELECT ( tens.i * 10 + units.i ) AS ii 
FROM   integers AS units 
       CROSS JOIN integers AS tens 
       CROSS JOIN table 
WHERE  ( tens.i * 10 + units.i ) BETWEEN 0 AND 24 
       AND doors & ( ( tens.i * 10 + units.i ) << 1 ); 
于 2012-12-24T19:04:19.140 に答える
1

MySQL でビット関数を使用できます。

select sum(case when doors & 1 << 0 = 1 then 1 else 0 end) as bit1,
       sum(case when doors & 1 << 1 = 1 then 1 else 0 end) as bit2,
       . . . 
from t

ステートメントを 24 回入力したくない場合は、スプレッドシートでステートメントを作成します。

于 2012-12-24T19:04:31.323 に答える