У меня есть 3 таблицы:
Molecule:
id
Atom:
id
MoleculeAtom: # Composite primary key
molecule_id
atom_id
Моя цель - убедиться, что никакая комбинация атомов, составляющих молекулу, не повторяется.Например, молекулу воды я бы сохранил в строке MoleculeAtom две строки;1 ряд для атома водорода и 1 ряд для атома кислорода.Как вы можете видеть, мне нужно убедиться, что ни одна другая молекула не имеет ТОЛЬКО водорода и кислорода, хотя могут быть и другие молекулы, которые включают водород и кислород.
На данный момент у меня есть вопрос, который определяет, какие молекулы включаютлибо водород, либо кислород, и только с 2 атомами в таблице MoleculeAtom.
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;
Что возвращает (демонстративный фрагмент):
+----+----------------------------+-----------+
| id | name | atomCount |
+----+----------------------------+-----------+
| 53 | Carbon Dioxide | 2 |
| 56 | Carbon Monoxide | 2 |
+----+----------------------------+-----------+
(я знаю, что и CO, и CO2 имеютте же самые точные атомы, в разных количествах, но не обращайте внимания на то, что, поскольку я отслеживаю величины как другой столбец в той же таблице.)
На данный момент я извлекаю приведенные выше результаты и проверяю их atom_idsчерез PHP, что означает, что я должен выдать отдельный запрос для каждой молекулы, что кажется неэффективным, поэтому я искал, можно ли сделать эту проверку с использованием строго SQL.
Извините за любые ошибки, которые могут быть химическимисвязано, это было давно с chem101.