MySQL-选择所有其他列=0的位置
假设您有一个包含许多属性字段的表,例如: id datetime q a c d . . . (etc)MySQL-选择所有其他列=0的位置,mysql,chemistry,Mysql,Chemistry,假设您有一个包含许多属性字段的表,例如: id datetime q a c d . . . (etc) BaseTable: id integer primary key datetime timestamp OtherTable: id integer references BaseTable(id) attribute char(1) text varchar(5
BaseTable:
id integer primary key
datetime timestamp
OtherTable:
id integer references BaseTable(id)
attribute char(1)
text varchar(50)
primary key (id,attribute)
身份证件
日期时间
Q
A.
C
D
.
.
.
(等)
其中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) 身份证件 名称 C 铁 氯 H . . . (etc-当新的复合插入包含未列出的元素时,会添加字段) 示例行: name = Hydrochloric acid C = 0 Fe = 0 Cl = 1 H = 1 . . . (everything else = 0) 名称=盐酸 C=0 Fe=0 Cl=1 H=1 . . . (其他一切=0) 从H=1和Cl=1的表中选择一个简单的
SELECT*的问题在于,它还包括其他情况,例如C Cl H(尽管它有C=1,但之所以选择它是因为Cl和H都是1)
这就是为什么我试图找出如何在所有其他字段都为0的情况下选择它 这不是一个现实的情况。您永远不会有不确定数量的int字段,因为您不能在没有ALTER语句的情况下修改表(仅在运行时)。至少,您不应该这样做。实际上,表中的列数不能是无限的,您只能有一定的数量。在这种情况下,您只需使用:
... where a = 1 and c = 5 and q = 0 and b = 0 and d = 0 and ...
如果您只是说数量是确定的,但应用程序使用的列数可能会更改,那么也需要在运行时使用相同的信息生成查询。例如,如果运行时未使用d
,则查询中将不使用它
但是这是一个非常糟糕的设计表,您应该考虑更好地规范它,比如把这些属性转换成一个单独的表(在这个新表中每行一个属性),并用<代码> ID 字段将它们链接回原始表,如:
id
datetime
q
a
c
d
.
.
.
(etc)
BaseTable:
id integer primary key
datetime timestamp
OtherTable:
id integer references BaseTable(id)
attribute char(1)
text varchar(50)
primary key (id,attribute)
这种模式允许在每个id
上使用任意属性
根据您的评论,您正在基于一些外部因素修改表,我认为这就是我们DBA界所说的“有趣的”设计决策:-)
我强烈建议不要这样做,但是,如果您认为忽略这个建议是合适的,那么您可以在大多数DBA实现中获得元数据
例如,MySQL在INFORMATION_SCHEMA
SCHEMA中有一个taht,您可以使用它来枚举给定表的所有列。使用它,您可以基于任意复杂的表动态构造有效的SQL语句
不是说这是个好主意,只是说这是可能的。您可以这样构造:
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
如果重复更改表结构,也应该动态更改查询。但这不是一个好的设计。您应该规范化该表(可能是通过将该表拆分为两个表,并将重复的列更改为一列,以便数据从多个列转换为一个列,而不是多个行)
在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
等等,您每次加载页面时都可能更改表?如何/在何处生成此语句?alter if字段不存在是一个单独的语句。insert是另一个语句。理想情况下,我希望能够使用“where all others=0”之类的语句。添加了更多的解释性材料,包括具体的示例。好吧,这正是我正在做的:我在运行时使用ALTER修改表,这样很容易处理。每次修改表时只需添加一个新字符串,然后像这样检查它:例如var string=“c=0”;“从a=1、b=5和“+”字符串的示例中选择*”(如果您添加列“c”),我试图避免显式声明0。。。具体例子见更新的问题我想我要问的是,是否有一些“整体”功能,或者我可以去“其他所有人=0”(或类似的东西)我想我要问的是,是否有一些“整体”功能,或者我可以去“其他所有人=0”(或类似的东西)。。。规范化的问题是,我仍然必须检查所有其他值都为0的情况,但是我需要一个额外的连接标准SQL中没有完整的函数,我也不知道在我遵循的任何特定于供应商的实现中有任何扩展。我想我没有看到如何规范化它,以便生成的选择条件变得更容易。(具体示例见上文更新的问题)