我有一个名为 warnings 的位域,存储为一个 int。 我想得到每个人的警告列表
假设我们有一张 table
NAME, WARNINGS
alex, 0
mike, 5
sarah, 2
其中整数的每一位对应一个警告#(位位置)。 目前这是在 perl 中使用 for 循环完成的
for(my $i=0; $i < $warning_size;$i++ ){
if( (1 << $i ) & $warning != 0){
print "$name\t" . $i+1 ."\n";
}
}
有什么方法可以让我通过 mysql 查询来处理这个问题。
对于上面的例子,我想要下面的输出:
name, warning
-------------
mike 1
mike 3
sarah 2
我试图将其归结为一个选择语句,
谢谢
最佳答案
试试这个 -
CREATE TABLE warn_bits(
b INT(11) NOT NULL
);
INSERT INTO warn_bits VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8);
SELECT w.name, wb.b FROM warnings w
JOIN warn_bits wb
ON ((w.WARNINGS >> wb.b - 1) & 1) > 0
ORDER BY w.name, wb.b;
+-------+---+
| name | b |
+-------+---+
| mike | 1 |
| mike | 3 |
| sarah | 2 |
+-------+---+
您可以扩展 warn_bits
表以支持 INT 或 BIGINT 数字。
编辑2
SELECT w.name, wb.b FROM warnings w
JOIN (
SELECT 1 b UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
) wb
ON ((w.WARNINGS >> wb.b - 1) & 1) > 0
ORDER BY w.name, wb.b;
关于mysql - 使用 MySQL 中的位域列将一行分解为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8521885/