我正在尝试优化这个 mysql 选择查询,但我不知道如何阅读它。想知道是否有人可以用 thw WHERE 子句来解释这个查询在做什么。
SELECT `id`, `size`, `download`, `mirror1`, `mirror2`, `mirror3`
FROM `entries`
WHERE (`flags` & '3') = '0';
它正在AND
对标志进行按位运算符,请在此处阅读:
http ://en.wikipedia.org/wiki/Bitwise_AND#AND
二进制中的 3 是 11,因此它检查是否未设置标志的低两位(例如,它们为 0),因为根据 where 子句,AND 运算符的结果必须为 0。
示例(假设标志具有以下值):
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
我假设你的目标是&
. 这是一个bitwise 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
你能确定它实际上是“ WHERE ( flags
& '3') = '0'; ”吗?是“ WHERE ( flags
& 3) = 0; ”更有意义吗?
凯文
从条目表中选择 id、size、download、mirror1、mirror2 和 mirror3 字段,其中 flags 作为二进制数与 3 与等于 0。
标志通常存储为位,这些位被转换为数字进行存储。由于一个标志通常是打开或关闭的,这对应于二进制 0 和 1。所以 0 可以关闭,1 可以打开。因此,四个标志的序列可以二进制表示为: 0 0 1 1 , (off, off, on, on) 相当于十进制 3。
为了满足与十进制 3(二进制 11)相乘的数字为零的条件,该数字必须具有两个最低位为零,因此(二进制):1 1 0 0 或 10100 等将返回零,因为 AND 仅在两个输入均为 1 时才返回 1。