我怎么读这个mysql选择查询?

时间:2013-03-16 19:00:12

标签: mysql sql

我正在尝试优化这个mysql选择查询,但我不知道如何阅读这个。想知道是否有人可以根据WHERE子句来解释这个查询正在做什么。

SELECT `id`, `size`, `download`, `mirror1`, `mirror2`, `mirror3` 
FROM `entries` 
WHERE (`flags` & '3') = '0';

4 个答案:

答案 0 :(得分:3)

它正在对标志执行按位AND运算符,请在此处阅读: http://en.wikipedia.org/wiki/Bitwise_AND#AND

二进制中的3是11,所以它检查是否未设置低位的两位标志(例如它们是0),因为根据where子句,AND运算符的结果必须为0。

示例(假设flags具有以下值):

Ex 1:    11101000 <-- WHERE clause would be true, since lower two bits are 0
Ex 2:    11111010 <-- WHERE clause would be false, since lower two bits are NOT 0

答案 1 :(得分:0)

我假设你的目标是&。这是bitwise AND

有关其工作原理的详细解释,请参阅此wikipedia article

  

按位AND采用两个相等长度的二进制表示   对每对相应位执行逻辑AND运算。   如果第一位为1,则每个位置的结果为1   位是1;否则,结果为0.在此,我们执行   两位乘法;即,1×0 = 0且1×1 = 1   例如:

    0101 (decimal 5)
AND 0011 (decimal 3)
  = 0001 (decimal 1)

此技术通常用于以非常紧凑的形式存储状态,用户权限或类似内容。我假设3是查询检查的两个特定状态:

00000000 <- TRUE
00000001 <- FALSE
00000010 <- FALSE
00000011 <- FALSE

答案 2 :(得分:0)

你能确定它实际上是“WHERE(flags&amp;'3')='0';”?是“哪里(flags&amp; 3)= 0;”哪个更有意义?

凯文

答案 3 :(得分:0)

从条目表中选择id,size,download,mirror1,mirror2和mirror3字段,其中标志为二进制数,与3的“3”等于零。

标志通常存储为位,转换为数字以进行存储。由于标志通常是打开或关闭,这对应于二进制0和1.因此0可以关闭,1可以打开。因此,四个标志的序列可以用二进制表示为:0 0 1 1,(off,off,on,on),相当于十进制3。

为了满足数字与小数3(二进制11)的数字给出零的条件,该数字必须将两个最低位设为零,因此(二进制):1 1 0 0或10100等将返回零,因为如果两个输入都为1,则AND仅返回1.