【发布时间】:2013-06-20 08:30:21
【问题描述】:
我有一个包含 60 个布尔 (TINYINT(1)) 可搜索列的表。用户可以使用给定列的任何子集作为搜索条件。基于此,我无法为我的需要创建一个好的索引。我想知道我是否可以创建另一个类型为 BIT(60) 的列 (concat_col),它将是可搜索列的连接,即
Table_A:
id |col1|col2|...|col60|concat_col
9999 | 1 | 0 |...| 1 |10...1
然后我可以为它创建一个好的索引(在 concat_col 上)但是有一个问题 - 我如何为它创建一个查询?
请看这个用伪代码编写的例子:
标准版(这显然可以正常工作):
SQL = SELECT * FROM Table_A WHERE col1=1 AND col60=1
我的版本('*' 是通配符,因为它既不是 '1' 也不是 '0'):
SQL = SELECT * FROM Table_a WHERE concat_col = '1*...1'
有没有可能有效地解决这个问题?非常感谢您的帮助!
【问题讨论】:
-
我会给你一个想法,因为你自己的路很好。您有 60 列。第一列是 2 的 0 次方。第二列是 2 的 1 次方。第三列是 2 的 3 次方。依此类推,直到达到 60。因此,您可以用单个数字来描述列的任意组合。
-
@N.B.谢谢您的帮助。但是,我认为我将无法实现我真正需要的。事实上,我将能够用数字描述列的任何组合,但我需要忽略除我感兴趣的列之外的所有列(在本例中为 col1 和 col60)。所有其他列的值都不重要。你的想法可行吗?
-
是的,这是可行的 :) 想象一下,如果您只想检查第 1 列和第 3 列。描述该组合的数字是十进制 5。第一列 = 1 (2 pow 0 = 1),第二列被跳过 (0),第三列是 2 pow 2 = 4. 4 + 1 = 5。
-
是的,我同意。但这假设所有其他位都是零 (0)。如果他们不是呢?如果即第 2 列也是 1,则 1+2+4=7。这意味着 7 也应该匹配我的查询。
-
没有。您不想引用的列始终为 0。您想要引用的列始终为 1。然后,当您将所有 60 列排成一行时,您会得到一个 1 和 0 的流,这是一个二进制数。这意味着您可以将该二进制数转换为十进制数。然后可以对十进制数进行索引。