我有以下表格:
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
。每个
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语法也适用于我)
最佳答案
没关系,我很愚蠢,没有意识到我有“复合的外来间接键”。
正确的查询是:
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 AND cst.property_cst = cva.property_cva)
where cst.validation_cst = 'celsius'
关于mysql - SQL select具有三级外键间接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30264439/