【发布时间】:2012-03-16 00:20:01
【问题描述】:
我有 3 张桌子:
Molecule:
id
Atom:
id
MoleculeAtom: # Composite primary key
molecule_id
atom_id
我的目标是确保组成分子的原子组合不会重复。例如,水分子,我会在 MoleculeAtom 表中存储两行; 1 行用于氢原子,1 行用于氧原子。如您所见,我需要确保没有其他分子只有氢和氧,即使可能有其他分子包括氢和氧。
此时我有一个查询,它可以识别哪些分子包含氢或氧,并且在 MoleculeAtom 表中只有 2 个原子。
SELECT
m.id, m.name, (SELECT count(*) from molecule_atom where molecule_id = m.id group by molecule_id) as atomCount
FROM
molecule AS m
INNER JOIN
molecule_atom AS ma ON ma.molecule_id = m.id
WHERE
ma.atom_id IN (1,2)
HAVING atomCount = 2;
哪个返回(示范性sn-p):
+----+----------------------------+-----------+
| id | name | atomCount |
+----+----------------------------+-----------+
| 53 | Carbon Dioxide | 2 |
| 56 | Carbon Monoxide | 2 |
+----+----------------------------+-----------+
(我知道,CO 和 CO2 都具有完全相同的原子,但数量不同,但请忽略这一点,因为我将这些数量作为同一张表中的另一列进行跟踪。)
到目前为止,我正在提取上述结果并通过 PHP 检查它们的 atom_ids,这意味着我必须为每个分子发出单独的查询,这似乎效率低下,所以我想看看是否可以使用严格的 SQL。
请原谅任何可能与化学有关的错误,自从 chem101 以来已经很久了。
【问题讨论】:
-
你知道除了
H2O,还有H2O2对吧? -
分子/原子模式抽象了我真正正在研究的东西,这就是为什么提到我不关心数量,只关心确保分子中唯一原子的原则。