0

我的表格布局是:

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

doors是一个位掩码,它完全由 PHP 使用,而不是 MySQL 以除了选择之外的任何方式使用。

我有兴趣汇总一些统计数据,所以我想做这样的伪代码:

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

我可以在 PHP 中轻松做到这一点,但它需要选择所有行并手动解析它们的掩码,或者 25 个单独的计数查询。我只是想知道是否有一种方法可以在一个选择查询中执行此操作,group by例如使用 a。

请注意,这是一次性使用,而不是在生产端使用

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 回答