У меня есть две таблицы, как показано ниже. Но у меня возникли проблемы с запросом. Я хочу запросить все сообщения, член группы которых равен can_view_group, а тип столбца can_view_group - JSON.
Я знаю только, что JSON_CONTAINS и WHERE (столбец) IN могут помочь мне выполнить работу, но я не могу заставить ее работать. Как я могу заставить это работать?
Спасибо.
P.S. Мне просто нужен простой код SQL, поскольку он должен быть самым простым, когда я применяю его к PHP-коду или к чему-либо еще.
post
----------------------------------------
post_id | can_view_group |
----------------------------------------
1 | ["1","2","3"] |
----------------------------------------
member_group
----------------------------------------
member_id | group_id |
----------------------------------------
123 | 1 |
----------------------------------------
123 | 2 |
----------------------------------------






Наиболее простым является использование нескольких вложенных функций REPLACE для получения строки, разделенной запятыми, и денормализованной функции MySQL FIND_IN_SET, которая работает со строкой, разделенной запятыми.
Запрос
SELECT
*
FROM
post
INNER JOIN
member_group
ON
FIND_IN_SET(member_group.group_id , REPLACE(REPLACE(REPLACE(post.can_view_group, '"', ''), '[', ''), ']', ''))
см. демонстрацию http://sqlfiddle.com/#!9/37e997/5
С одной стороны, вы никогда не сможете использовать индекс при таком подходе.
Лучшим вариантом по-прежнему является нормализация, но для этого обязательно потребуется изменение приложения.
Большое спасибо! Это просто потрясающе. Какой была бы структура, если бы я хотел ее нормализовать для этой ситуации?
Лучше нормализовать структуру данных