循环在MySql中,还是替代?

时间:2010-07-26 22:33:50

标签: mysql database-design loops entity-attribute-value

我有一个带有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

2 个答案:

答案 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