我有一个带有innoDB表的MySql数据库。非常简化这是两个表格的布局:
表A:
- 控件ID(PK)
- controlText
表B:
- controlOptionID(PK)
- controlID(FK到表A)
- controlOptionType
- controlOptionValue
如此多的controlOptions(表B)可以引用一个控件(为该控件提供多个选项)。但是对于每个选项,在表B中创建了两行:一行具有controlOptionType =“linkToCreator”和controlOptionValue =(模板的ID是从*创建的)。另一行type =“optionSelected”和value =“true”(或false)。
- =它是一个相当复杂的设置,但基本上不是设置列,我们通过类型是列的调用来制作动态列。所以我无法用FK链接到模板。
所以现在我需要选择每个控件(将有2个controlOptions链接到它),其中一个controlOptionValue值为true或false(取决于我需要的),另一个controlOptionValue是我指定的文本ID。 / p>
我认为最好的方法是
SELECT * FROM tableB WHERE controlOptionType = 'linkToCreator'
然后在结果集上循环说:
SELECT * FROM tableB WHERE tableB.controlID = (the controlID in this iterations row) AND tableB.controlValue = 'true'
但也许那些效率非常低,无论哪种方式我都不知道如何做到这一点。如果我能够获得一个我指定了templateID和true或false的单个查询(即不使用存储过程)会很棒,如果它没有找到任何内容,它会给我一个行结果。
BTW这是我们的应用程序中的搜索,需要经过TONS行,因此性能至关重要。是的,我知道设置不是最好的......
谢谢:D
答案 0 :(得分:4)
喜欢这个?
SELECT * FROM tableA AS A
LEFT JOIN tableB AS ctrl1 ON (A.controlID = ctrl1.controlID AND ctrl1.controlOptionType = ? AND ctrl1.controlOptionValue = ?)
LEFT JOIN tableB AS ctrl2 ON (A.controlID = ctrl2.controlID AND ctrl2.controlOptionType = ? AND ctrl2.controlOptionValue = ?)
答案 1 :(得分:0)
试试这个:
SELECT *
FROM Table_A
LEFT JOIN Table_B
ON Table_A.ControlID = Table_B.ControlID
WHERE Table_A.controlOptionType = 'linkToCreator