MYSQL Поиск денормализованных таблиц - PullRequest
0 голосов
/ 12 декабря 2011

Здравствуйте, попутчики Stack Overflow. Я не совсем уверен, как спросить это, кроме как с картинками, чтобы лучше объяснить, к чему я клоню. Если по какой-то причине это было задано в другом месте, и я не смог найти его, я прошу прощения.

У меня есть 2 таблицы tableA и tableB. Таблица A содержит столбец с пометкой id и displayName, в котором есть несколько десятков элементов (для простоты мы примем только 5). Столбец ID является уникальным и автоматически увеличивается, он также является первичным ключом для поиска. Вторая таблица (TableB) также содержит идентификатор для этого элемента, а также 4 ссылки на идентификаторы TableA и несколько посторонних частей информации, которые не имеют значения. Итак, это выглядит так:

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: ВЫБЕРИТЕ имя 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 Ответ

2 голосов
/ 12 декабря 2011

Вам просто нужно сделать 4 объединения после группировки.

PS Я не понимаю, почему вы группируете результаты по имени в таблице 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;
...