Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-选择所有其他列=0的位置_Mysql_Chemistry - Fatal编程技术网

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

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

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

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)
身份证件 日期时间 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中没有完整的函数,我也不知道在我遵循的任何特定于供应商的实现中有任何扩展。我想我没有看到如何规范化它,以便生成的选择条件变得更容易。(具体示例见上文更新的问题)