MySql присоединиться к одному ко многим - PullRequest
0 голосов
/ 05 января 2020

Я хочу объединить пару таблиц, которые имеют отношение один ко многим, но у меня возникают проблемы при разработке, как это сделать.

У меня есть одна таблица со списком элементов и вторая таблица, в которой есть список их идентификаторов против идентификатора пользователя и действия. У каждого пользователя может быть только одно действие против каждого элемента, и я хочу объединить их таким образом, чтобы я получал вывод с элементом вместе с действием, выполняемым каждым пользователем.

таблица элементов

item_id name
1       Desk
2       Phone
3       Fax

таблица действий

item_id user_id action
1       1       sell
1       2       buy
1       3       sell
2       1       sell
2       2       buy
2       3       sell
3       1       sell
3       3       sell

желаемый вывод

item_id name  user_id1 user_id2 user_id3
1       Desk  sell     buy      sell
2       Phone sell     buy      sell
3       Fax   sell     NULL     sell

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 05 января 2020

Было бы лучше, если бы мы использовали современную функцию sql wrap для этой проблемы, но, к сожалению, до сих пор нет доступных заводских функций. Похоже, нам следует создать любое пользовательское расширение для встраивания в систему (механизм) или манипулировать набором результатов (результатом запроса) из уровня приложения в качестве альтернативы.

В противном случае мы также можем использовать ANSI / ISO Join , чтобы легко решить эту проблему.

Select items.*, a1.action user_id1, a2.action user_id2, a3.action user_id3
From items
Left Join actions a1
 On items.id = a1.item_id and a1.user_id = 1
Left Join actions a2
 On items.id = a2.item_id and a2.user_id = 2
Left Join actions a3
 On items.id = a3.item_id and a3.user_id = 3

Надеюсь, мой ответ может помочь.

Приветствия.

0 голосов
/ 05 января 2020

Если вы заранее знаете пользователей, вы можете использовать условное агрегирование:

select i.item_id, i.name,
  max(case when a.user_id = 1 then a.action end) as user_1,
  max(case when a.user_id = 2 then a.action end) as user_2,
  max(case when a.user_id = 3 then a.action end) as user_3
from items i left join 
  actions_table a 
  on a.item_id = i.item_id
group by i.item_id, i.name;

Если вы хотите обрабатывать переменное число пользователей, вы не можете использовать простое select, поскольку столбцы в select должны быть явно определены. Один из методов - динамический c SQL, где вы создаете SQL со всеми пользователями (используя logi c, аналогичный описанному выше). Другой метод будет хранить результаты, используя JSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...