mySQL SELECT行,其中设置了整数的特定位

der*_*ert 7 mysql select integer bit

我必须在发布表中执行选择查询,其中设置了整数的特定位.整数表示位掩码中的一组类别:例如

1 => health
2 => marketing
3 => personal
4 => music
5 => video
6 => design
7 => fashion
8 => ......
Run Code Online (Sandbox Code Playgroud)

数据示例:

id | categories | title
1  | 11         | bla bla
2  | 48         | blabla, too
Run Code Online (Sandbox Code Playgroud)

我需要一个mysql查询来选择标记为特定类别的帖子.让我们说"所有视频发布"这意味着我需要一个结果集的帖子,其中设置了catgories列的第5位(例如16,17,48 ....)

SELECT * FROM postings WHERE ....????
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

Mar*_*ams 12

您可以使用这样的按位运算符.对于视频(第5位):

WHERE categories & 16 = 16
Run Code Online (Sandbox Code Playgroud)

16使用以下值替换每个位的值:

1 = 1
2 = 2
3 = 4
4 = 8
5 = 16
6 = 32
7 = 64
8 = 128
Run Code Online (Sandbox Code Playgroud)

这从最低位到最高位,这与大多数程序员的想法相反.他们也从零开始.


Mik*_*sen 5

怎么样

SELECT * FROM postings WHERE (categories & 16) > 0; -- 16 is 5th bit over
Run Code Online (Sandbox Code Playgroud)

这样做的一个问题是您可能不会命中索引,因此如果数据量很大,您可能会遇到性能问题。

某些数据库(例如 PostgreSQL)允许您在表达式上定义索引,如下所示。我不确定mySQL是否有这个功能。如果这很重要,您可能需要考虑将它们分解为单独的布尔列或新表。