Mysql-запрос для получения значения из списка значений в другой таблице - PullRequest
0 голосов
/ 29 апреля 2019

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

У меня есть две таблицы:

table1: action_master                         table2: object_action

id   action                                   items      actions_id_list
-------------                                 ---------------------------
1    talk                                     Human      1,2,4
2    walk                                     Dog        3
3    bark                                     Fish       4,5
4    eat
5    swim

Теперь я хочу написать запрос на выборку, который может произвести вывод следующим образом:

items      actions_desc_list
-----------------------------
Human      talk,walk,eat
Dog        bark
Fish       eat,swim

Примечание: у меня нет возможности сохранять список описания действий в таблице object_action напрямую,Я должен использовать идентификаторы.

1 Ответ

2 голосов
/ 29 апреля 2019

Общее рассмотрение ситуации

Не следует хранить списки через запятую как значения в столбце.Это нарушает нормальные формы в базе данных.Вы должны подумать о normalization процессе.Причина, по которой у вас возникла проблема, заключается в том, что список, разделенный запятыми, был спроектирован таким образом.Обратите внимание, что здесь нет правильного способа создания ограничения FOREIGN KEY.

Решение

Тем не менее, поскольку вы, скорее всего, чем не можете, не сможетечтобы выполнить редизайн схемы (если возможно, хотя бы сообщите кому-нибудь, кто может избежать будущих проблем), вы можете использовать FIND_IN_SET функцию MySQL в качестве условия JOIN, а затем GROUP_CONCAT свои результаты.

FIND_IN_SET(f1, f2) возвращает позицию строки f1 в строке f2.Если мы поставим его в условие > 0, он вернет TRUE, когда f1 существует в пределах f2.

В вашем случае:

  • f1 == action_master.id
  • f2 == object_action.actions_id_list

Пример данных

create table action_master( id int, action varchar(10));
create table object_action (items varchar(10), actions_id_list varchar(15));

insert into action_master values (1,'talk'), (2,'walk'), (3,'bark'), (4,'eat'), (5,'swim');
insert into object_action values ('Human','1,2,4'),('Dog','3'),('Fish','4,5');

Запрос для получения результата

select 
    oa.items
  , group_concat(am.action order by am.id) as actions_desc_list
from object_action oa
inner join action_master am on
  find_in_set(am.id, oa.actions_id_list) > 0
group by oa.items

См. LIVE DEMO

Результат

items   actions_desc_list
-------------------------
Dog     bark
Fish    eat,swim
Human   talk,walk,eat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...