Я работаю над запросом PHP PDO и хочу проверить, пересекается ли столбец JSON с массивом PHP.
$classes = [1,2,3,4,5,6,7];
|---------------------|------------------|
| students | classes |
|---------------------|------------------|
| 12 | [1,3,6] |
|---------------------|------------------|
| 13 | [2,9,10] |
|---------------------|------------------|
| 14 | [9,8,10] |
|---------------------|------------------|
например, в приведенном выше примере мне нужно, чтобы все ученики хотя бы с одним классом существовали в массиве $classes = [1,2,3,4,5,6,7];, поэтому в этом случае результат должен быть:
|---------------------|------------------|
| students | classes |
|---------------------|------------------|
| 12 | [1,3,6] |
|---------------------|------------------|
| 13 | [2,9,10] |
|---------------------|------------------|
Я попытался сделать массив в виде строки и сделать "% like%", но он не работает, потому что 'x,y,z' отсутствует в 'a,b,x,c'.
поэтому мне было интересно, можем ли мы сравнить два массива, хранящиеся в MySQL, как json, а другой - массив PHP. и мне нужно сделать это внутри запроса.
Благодарность
да, два массива хранятся в MySQL как json, а другой - массив PHP. и мне нужно сделать это внутри запроса
Не могли бы вы показать несколько примеров данных и кода? Также ожидаемый результат
@executable мне не нужно сравнивать только два массива php, проверьте мой комментарий, я отредактировал вопрос, чтобы объяснить больше, в любом случае спасибо
Вы имеете в виду $json_column = "['x','y','z']";?
получить JSON из базы данных, десериализовать его в массив PHP, а затем сравнить данные. Как вы думаете, почему вам «нужно» делать это именно в запросе? Все, что вам нужно сделать, это сравнить две строки, что не поможет вам сопоставить фактические элементы данных в строках.
@ADyson проверять мои обновления
В порядке. Проблема здесь в том, что ваши данные ненормализованы. Вы должны хранить список классов в отдельной таблице, где каждый идентификатор класса находится в отдельной строке таблицы с внешним ключом, возвращаемым студенту. Если вы когда-нибудь обнаружите, что храните несколько значений в одном поле, как это, то вы знаете, что допустили ошибку в дизайне своей базы данных. Если вы спроектируете его правильно нормализованным способом, тогда нужный вам запрос будет просто включать JOIN и простое предложение IN в разделе WHERE.
(P.S. Использование полей JSON отлично подходит для произвольного фрагмента информации, который вы просто хотите сохранить и получить, но не для вещей, которые являются частью фактической структуры и запросов ваших данных, таких как этот)
Да, @ADyson. Я согласен с вами, что данные денормализованы. но в моем случае я нашел такие данные, и это будет большой проблемой, чтобы нормализовать их и провести весь рефакторинг, поэтому я думал об этом как об обходе, но все же приятно иметь функцию в такой ситуации.






Вы пробовали использовать JSON_EXTRACT (ссылка на сайт)?
Это должно позволить вам рассматривать его как массив.
DigitalOcean HowTo (я никак не связан с ними).
Итак, вы хотите сравнить два массива?