3

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

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

4 回答 4

3

它正在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
于 2013-03-16T19:04:27.333 回答
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
于 2013-03-16T19:06:04.170 回答
0

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

凯文

于 2013-03-16T19:11:08.813 回答
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。

于 2013-03-16T19:12:20.473 回答