У меня есть следующие таблицы:SQL выбрать с тремя уровнями внешнего ключа косвенностью
component_cmp [id], id_cty_cmp*, ...
comp_structure_cst [id_cty_cst*, property_cst], validation_cst, ...
comp_value_cva [id_cmp_cva*, property_cva], value_cva, ...
comp_type_cty [id_cty], ...
Кронштейны являются первичные ключи, * Внешний ключ (примерно)
ComponentType
имеет много Component
с, каждый Component
имеет много CompValue
s. Каждый CompType
владеет многими CompStructure
, которые являются своего рода «шаблонами» для CompValue
.
Схема немного грязная, да.
Что-то вроде этого (грубой диаграммы ER):
CompTypeCty -+-----< CompStructureCst - - - - indirect -
| |
+-------< ComponentCmp -+----< CompValueCva - - - - - -
Я хочу, чтобы выбрать строки из CompValueCva
, которые имеют validation_cst
равные заданное значение. Это действительно противное обращение, но я считаю, что это можно сделать в SQL.
До сих пор я придумал это, но это не так (дает мне грузовик неправильных записей дубликатов):
select cva.*
from comp_value_cva cva
left join component_cmp cmp on cva.id_cmp_cva = cmp.id
left join comp_structure_cst cst on cst.id_cty_cst = cmp.id_cty_cmp
where cst.validation_cst = 'celsius';
(это SQLite синтаксис, но синтаксис MySQL будет работать для меня тоже)
Вы на самом деле не нужно 'LEFT' присоединяется для этого. (или, по крайней мере, вы не были бы в mysql) – Uueerdo
Хорошо, покажите мне более быстрый/лучший способ, я все еще могу принять его ^^ – MightyPork
Я не уверен, будет ли он быстрее, потому что внутренний оптимизатор запросов может делайте это уже, но «INNER JOIN» может помочь, если оптимизатор запросов тупой. Кроме того, я не знаю точно, не зная больше о вашей структуре данных, но я предполагаю, что таблица 'cmp' может даже не понадобиться в этом запросе, поскольку похоже, что у вас есть прямая ссылка на' cva' в 'cst'. Но да, я мог бы недооценивать трудность описания ваших отношений лаконично. – Uueerdo