我正在尝试优化这个mysql选择查询,但我不知道如何阅读这个。想知道是否有人可以根据WHERE子句来解释这个查询正在做什么。
SELECT `id`, `size`, `download`, `mirror1`, `mirror2`, `mirror3`
FROM `entries`
WHERE (`flags` & '3') = '0';
答案 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.