2011-12-12 71 views
0

你好旅行者堆栈溢出。我并不完全确定如何去问这个,而不是用图片来更好地解释我所得到的。如果有机会在别处问过这个问题,我找不到它,我表示歉意。MYSQL非规范化表查找

我有2个表tableA和tableB。 TableA包含一个标记为id和displayName的列,其中有几十个项目(为了简单起见,我们假设只有5个)。 ID列是唯一的,并且自动递增,它也是搜索的主键。第二个表格(TableB)也包含该项目的id,但也包含4个对TableA's 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

现在我想要做的是,而不必翻,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 | 
----------------------------------------------- 

回答

2

你只需要做分组后4联接。

P.S.我不明白,为什么你在tableB中将名字分组。

假设你不必做groupung这种方式(在其他情况下,其他值没有多大意义):

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;