MYSQL非规范化表查找

时间:2011-12-12 09:27:53

标签: mysql denormalized

Stack Overflow的其他旅客我不完全确定如何用图片来解释这个问题,以便更好地解释我的目标。如果有可能在其他地方被问过,我找不到它,我道歉。

我有2个表tableA和tableB。 TableA包含一个标记为id和displayName的列,其中有几十个项目(为简单起见,我们假设只有5个)。 ID列是唯一的并且自动递增,它也是搜索的主键。第二个表(TableB)包含该项的id,但也有4个对TableA的id的引用和一些无关的无关信息。所以它看起来像这样:

TableA
-------------------------
|  id    |  displayName  |
-------------------------
|  1     |  itemA        |
|  2     |  itemB        |
|  3     |  itemC        |
|  4     |  itemD        |
|  5     |  itemE        |
-------------------------

TableB
--------------------------------------------------------
|  id    | name |  varA   |  varB   |  varC   |  varD   |
--------------------------------------------------------
|  1     | elm1 |    3    |    4    |    2    |    5    |
|  2     | elm2 |    4    |    5    |    2    |    1    |
|  3     | elm3 |    1    |    4    |    3    |    2    |
|  4     | elm4 |    2    |    1    |    5    |    4    |
|  5     | elm5 |    3    |    4    |    5    |    1    |
--------------------------------------------------------

我目前有一个查询会折叠值并向我提供我需要的信息: SQL:SELECT tB.name,tB.varA,tB.varB,tB.varC,tB.varD FROM tableB tB GROUP BY tB.name

现在我想做的不是将varA,varB等显示为数字,而是将数据与TableA相关联并插入displayName。而不是

Result
-----------------------------------------------
| name |  varA   |  varB   |  varC   |  varD   |
-----------------------------------------------
| elm1 |    3    |    4    |    2    |    5    |
| elm2 |    4    |    5    |    2    |    1    |
-----------------------------------------------

它会显示:

Result
-----------------------------------------------
| name |  varA   |  varB   |  varC   |  varD   |
-----------------------------------------------
| elm1 |  itemC  |  itemD  |  itemB  |  itemE  |
| elm2 |  itemD  |  itemE  |  itemB  |  itemA  |
-----------------------------------------------

1 个答案:

答案 0 :(得分:2)

分组后你只需要做4个连接。

P.S。我不明白,为什么你在表B中按名称对结果进行分组。

假设您不必以这种方式制作分组(在其他情况下,其他值没有多大意义):

SELECT b.name,
    aa.displayName as varA,
    ab.displayName as varB,
    ac.displayName as varC,
    ad.displayName as varD
FROM tableB as b
JOIN tableA as aa ON b.varA = aa.id
JOIN tableA as ab ON b.varB = ab.id
JOIN tableA as ac ON b.varC = ac.id
JOIN tableA as ad ON b.varD = ad.id;