MySQL - 选择所有其他列= 0的位置

时间:2011-12-28 00:53:27

标签: mysql chemistry

假设您有一个包含许多属性字段的表,例如:

id
datetime
q
a
c
d
.
.
.
(etc)

其中q,a,c,d等表示无限数量的int字段,其名称生成(也在运行时创建)

如何使用约束选择某些特定字段是特定数字而其他所有字段都是0?

(例如)a = 1,c = 5,其他所有都是0?


更新

我想我要求的是,如果有一些“整体”功能或其他我可以去“其他所有人= 0”(或类似的东西)。

规范化的问题是,即使在连接之后,我仍然需要检查特定的非零值以及所有其他字段(或规范化字段)是否为0.


具体应用:

化合物表

id
name
C
Fe
Cl
H
.
.
.
(etc - fields are added when new compound insert contains elements not listed)

示例行:

name = Hydrochloric acid
C = 0
Fe = 0
Cl = 1
H = 1
.
.
. 
(everything else = 0)

具有简单SELECT * FROM table WHERE H=1 AND Cl = 1的问题在于它还包括其他情况,例如C Cl H(即使它具有C = 1,也选择它,因为Cl和H都是1)< / p>

这就是为什么我想弄清楚如何在所有其他字段为0的情况下选择它!

3 个答案:

答案 0 :(得分:1)

这不是一个现实的情况。您将永远不会有无限数量的int字段,因为您不能仅在没有ALTER语句的情况下修改表(仅在运行时)。至少,你不应该。

答案 1 :(得分:1)

您实际上不能在表格中拥有无限数量的列 - 您只能使用明确的数量。在这种情况下,您只需使用:

... where a = 1 and c = 5 and q = 0 and b = 0 and d = 0 and ...

如果您只是意味着数量是明确的,但应用程序使用的列数可能会发生变化,那么查询也需要在运行时使用相同的信息生成。例如,如果在运行时未使用d,则它将不在查询范围内。

但这是一个设计非常糟糕的表,您应该考虑更好地对其进行规范化,例如将这些属性转移到单独的表(此新表中每行一个属性)并使用{{将它们链接回原始表) 1}}字段,例如:

id

这种架构将允许每个BaseTable: id integer primary key datetime timestamp OtherTable: id integer references BaseTable(id) attribute char(1) text varchar(50) primary key (id,attribute) 上的任意属性。


根据您的评论,基于某些外部因素,您正在改变表格,我认为这是我们DBA世界中所谓的“有趣”设计决策: - )

我强烈反对这一点,但是,如果您认为忽略该建议,则可以在大多数DBA实现中获取元数据。

例如,MySQL在id架构中有COLUMNS table,您可以使用它来枚举给定表的所有列。使用它,您可以基于任意复杂的表动态构造有效的SQL语句。

不是说这是的想法,只是有可能。

答案 2 :(得分:0)

你构建这样的东西:

WHERE a=1
  AND c=5
  AND d=0
  AND e=0
  ...

或者这个:

WHERE (a, c, d, e, ...) =
      (1, 5, 0, 0, ...)

没有什么比如:

WHERE ALL OTHERS = 0

如果您反复更改表结构,则还应动态更改查询。但这不是一个好的设计。您应该规范化表(可能通过将表拆分为2个表并将重复的列更改为一列,因此数据从许多列转到一列但很多行)。


OP编辑后更新

化学化合物可能的标准化 - 元素:

Compound
--------
CompoundId   Int          Primary Key
Name         Varchar(250) Unique
...other stuff

Element
-------
ElementCode  Char(2)      Primary Key
Name         Varchar(50)  Unique 

Structure
---------
CompoundId   Int 
ElementCode  Char(2) 
Ratio        Int
Primary Key (CompoundId, ElementCode) 
Foreign Key (CompoundId)
  References Compound(CompoundId)
Foreign Key (ElementCode)
  References Element(ElementCode)

包含样本数据:

CompoundId  Name 
------------------------------
 1          Hydrochloric acid
 2          Water
 3          Glucose

ElementCode  Name 
---------------------
 H           Hydrogen
 C           Carbon
 O           Oxygen 
 Cl          Chlorium 

CompoundId  ElementCode  Ratio 
------------------------------
 1           H            1
 1           Cl           1 
 2           H            2
 2           O            1
 3           H            12
 3           C            6
 3           O            6