我有以下表格:

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/

10-12 22:22