代码之家  ›  专栏  ›  技术社区  ›  TomH

如何使用查阅表格中的行作为MySQL查询中的列?

  •  0
  • TomH  · 技术社区  · 14 年前

    我正在尝试构建一个MySQL查询,该查询使用查找表中的行作为结果集中的列。

    可查找的

    id  |  AnalysisString
    1   |  color
    2   |  size
    3   |  weight
    4   |  speed
    

    可评分的

    id  |  lookupID | score | customerID
      1 |      1    |   A   |     1
      2 |      2    |   C   |     1 
      3 |      4    |   B   |     1 
      4 |      2    |   A   |     2
      5 |      3    |   A   |     2
      6 |      1    |   A   |     3 
      7 |      2    |   F   |     3
    

    我想要一个将相关的可查找行用作查询中的列的查询,这样我就可以得到如下结果:

    customerID |  color  | size  | weight  | speed
         1          A        C                 D
         2                   A        A    
         3          A        F
    

    问题的关键在于,可能会有额外的行添加到可查找表中,并且查询应该是动态的,而不是硬编码查找ID。也就是说,这将起作用:

    SELECT st.customerID, 
    (SELECT st1.score FROM ScoreTable st1 WHERE lookupID=1 AND st.customerID = st1.customerID) AS color,
    (SELECT st1.score FROM ScoreTable st1 WHERE lookupID=2 AND st.customerID = st1.customerID) AS size,
    (SELECT st1.score FROM ScoreTable st1 WHERE lookupID=3 AND st.customerID = st1.customerID) AS weight,
    (SELECT st1.score FROM ScoreTable st1 WHERE lookupID=4 AND st.customerID = st1.customerID) AS speed
    FROM ScoreTable st
    GROUP BY st.customerID
    

    直到在lookuptable中添加了第五行。…

    也许我破坏了整个关系模型,必须在后端PHP代码中解决这个问题?

    感谢您的指点/指导。

    汤姆

    2 回复  |  直到 14 年前
        1
  •  1
  •   Marek Rocki    14 年前

    您已经构建了EAV数据库。当涉及到可维护性、效率和正确性时,要准备好承受很多痛苦。”这是数据建模中的设计异常之一。( http://decipherinfosys.wordpress.com/2007/01/29/name-value-pair-design/ )

    最好的解决方案是将数据库重新设计成更正常的模式。

        2
  •  1
  •   Marcelo Cantos    14 年前

    您要做的通常被称为交叉表查询或交叉表查询。一些DBMS直接支持交叉标签,但MySQL不是其中之一,Afaik(有一个博客条目 here 描述了模拟效果的艰难过程)。

    有两种方法可以解决这一问题:

    1. 一点也不交叉。相反,按照行ID对输出进行排序,然后分析字符串,并用编程语言生成表格输出。
    2. 在编程语言中即时生成代码以发出适当的查询。
    3. 按照上面提到的博客来实现服务器端解决方案。

    还可以考虑@marek的答案,这表明您最好重新构建模式。然而,这个建议并没有给出。有时,关键价值模型适合于手头的问题。