Объединение всех совпадений из таблицы соединений в столбец - PullRequest
0 голосов
/ 29 января 2020

У меня есть две MySQL таблицы (table_a и table_b) и таблица соединений (table_ c).

Структуры таблиц:

  • table_a:
__________________
| table_a:       |
|----------------|
| id             |
| result_column  |
------------------
  • table_b:
__________________
| table_b:       |
|----------------|
| id             |
| name           |
------------------
  • table_ c:
__________________
| table_c:       |
|----------------|
| id             |
| table_a_id     |
| table_b_id     |
------------------

Моя цель:

Я хочу найти запрос, который будет:

  1. Перебирать каждую запись table_a и получать значение table_a.id
  2. Найти все записи в table_ c с соответствующим значением table_ c .table_a_id
  3. Для каждой соответствующей записи в таблице_ c получить значение table_ c .table_b_id
  4. Найти запись в table_b у которого есть совпадающее значение table_b.id
  5. Для этой совпадающей записи в table_b получите значение table_b.name
  6. В table_a объедините каждое совпадающее значение имени с соответствующим table_a.result_column

Пример: до запроса:

_______________________  _________________________________  ________________
| table_a:            |  | table_c:                      |  | table_b:     |
|---------------------|  |-------------------------------|  |--------------|
| id  | result_column |  | id  | table_a_id | table_b_id |  | id  | name   |
|-----|---------------|  |-----|------------|------------|  |-----|--------|
|  1  |               |  |  1  |      1     |      3     |  |  1  | Kevin  |
|  2  |               |  |  2  |      1     |      4     |  |  2  | Jesse  |
|  3  |               |  |  3  |      2     |      2     |  |  3  | Karen  |
-----------------------  |  4  |      3     |      1     |  |  4  | Tim    |
                         |  5  |      3     |      5     |  |  5  | Lauren |
                         ---------------------------------  ----------------

После запроса:

_______________________  _________________________________  ________________
| table_a:            |  | table_c:                      |  | table_b:     |
|---------------------|  |-------------------------------|  |--------------|
| id  | result_column |  | id  | table_a_id | table_b_id |  | id  | name   |
|-----|---------------|  |-----|------------|------------|  |-----|--------|
|  1  | Karen, Tim    |  |  1  |      1     |      3     |  |  1  | Kevin  |
|  2  | Jesse         |  |  2  |      1     |      4     |  |  2  | Jesse  |
|  3  | Kevin, Lauren |  |  3  |      2     |      2     |  |  3  | Karen  |
-----------------------  |  4  |      3     |      1     |  |  4  | Tim    |
                         |  5  |      3     |      5     |  |  5  | Lauren |
                         ---------------------------------  ----------------

Для абсолютного кл Я понимаю, что это невероятно плохая практика в реляционной таблице данных. Это настолько далеко от нормализации, насколько это возможно. Я бы никогда не разработал такую ​​базу данных. Мне было поручено создать пользовательский столбец со списком значений чисто для бизнес-случая.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Предыдущий ответ близок; но вы также требовали, чтобы вам соответствовали только те записи в таблице C, которые находятся в A.

Первый запрос не удовлетворяет этому требованию; но оператор update делает это, поскольку он будет обновлять только записи в таблице A, если идентификатор совпадает со значением table_a_id, извлеченным из таблицы C.

Учитывая то, что вы сказали, что хотели получить для конечного результата, оператор обновления выше будет работать. Если вы хотите, чтобы sh было явным в вашей логике c, просто добавьте объединение из таблицы А в таблицу C.

select a.id, group_concat(b.name separator ', ') 
from a 
join c ON (a.id = c.table_a_id)
join b ON (c.table_b_id = b.id)
group by a.id;
1 голос
/ 29 января 2020

Похоже, что вам нужен запрос:

select c.table_a_id, group_concat(b.name separator ', ') 
from c join
     b
     on c.table_b_id = b.id
group by c.table_a_id;

Если вы действительно хотите обновить a, вы можете поместить его в оператор update:

update a join
       (select c.table_a_id, group_concat(b.name separator ', ') as names
        from c join
             b
             on c.table_b_id = b.id
        group by c.table_a_id
       ) cb
       on cb.table_a_id = a.id
    set result_column = cb.names
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...