0

我有一个带有 innoDB 表的 MySql 数据库。非常简化,这是两个表的布局方式:

表 A:

  • 控制ID(PK)
  • 控制文本

表 B:

  • 控制选项ID(pk)
  • 控制ID(FK到表A)
  • 控制选项类型
  • 控制选项值

如此多的 controlOptions(table B) 可以引用一个控件(为该控件提供多个选项)。但是对于每个选项,在表 B 中创建了两行:一行带有 controlOptionType = "linkToCreator" 和 controlOptionValue =(创建模板的 ID *)。而另一行类型 = “optionSelected”,值 = “true”(或 false)。

  • = 这是一个相当复杂的设置,但基本上我们不是设置列,而是通过类型是该列的名称来制作动态列。所以我无法使用 FK 链接到模板。

所以现在我需要选择每个控件(将有 2 个 controlOptions 链接到它),其中一个 controlOptionValue 值为真或假(取决于我需要什么),另一个 controlOptionValue 是我指定的文本 ID。

我认为最好的方法是

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 的查询(即不使用存储过程),并且如果它没有找到任何东西,它会给我一个行结果,那就太好了。

顺便说一句,这是为了在我们的应用程序中进行搜索,需要遍历大量行,因此性能至关重要。是的,我知道设置不是最好的......

感谢:D

4

2 回答 2

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 = ?)

于 2010-07-26T22:38:03.797 回答
0

试试这个:

SELECT * 
FROM Table_A 
LEFT JOIN Table_B
ON Table_A.ControlID = Table_B.ControlID
WHERE Table_A.controlOptionType = 'linkToCreator
于 2010-07-26T22:52:12.813 回答