Как получить уникальные значения JSON массива из ячейки MySQL?

Добрый день, в таблице есть колонка, содержащая массивы значений в JSON'е, например:
| id | values |
| 1 | [1,2,3] |
| 2 | [2,3,4] |
Мне необходимо выполнить что-то вроде SELECT DISTINCT, но для значений массива:
| uniques |
| 1 |
| 2 |
| 3 |
| 4 |
Можно ли это сделать, и если можно, то как?
  • Вопрос задан
  • 131 просмотр
Пригласить эксперта
Ответы на вопрос 3
@FanatPHP
Не надо хранить в базе данных " массивы значений в JSON'е".
MySQL - реляционная датабаза. Это означает, что база данных строится из связанных таблиц.
И вместо колонки values должна быть отдельная таблица,
table_id | value
1 | 1
1 | 2
1 | 3
2 | 2
2 | 3
2 | 4

И тогда все выборки будут делаться примитивными SQL запросами, без малейших затруднений со стороны разработчика.
Ответ написан
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
json-типы в субд такая же бестолковая дань моде как и nosql-хранилища, которые пытаются обойти необходимость нормализации для снижения порога вхождения. в данном случае, слепое следование этой моде привело к печальным последствиям.

но если все совсем плохо, то можно почитать про Secondary Indexes and Generated Columns
Ответ написан
@opravdin Автор вопроса
Вопрос полностью решен. Проверил несколько способов: подсчетом на бэке, запросом из этого ответа на stackoverflow (https://stackoverflow.com/questions/39906435/conve... а также тестом аналогичной структуры, но реляционно.
Производительность проверил на таблице из 50к записей, 53к элементов в колонке суммарно (сумма длин всех массивов), среди которых ~320 уникальных элементов. В случае с реляционной таблицей, соответственно, 53к строк.
Решение 1. SELECT DISTINCT по колонке JSON (отсекает одинаковые массивы, которых в моем случае много). На бэке megre по всем массивам и unique. Время выполнения 0.57 секунды (учтено время от инициализации ORM до строки перед return)
Решение 2. Запрос со stackoverflow. 0.23 секунды. (учитывал только время запроса в phpmyadmin)
Решение 3. Реляционная форма данных. 0.03 секунды. (учитывал только время запроса в phpmyadmin)
Все 3 решения по скорости устраивают, запрос 2 среди имеющегося выглядит более костыльным
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы