Mysql поиск в массиве json с оператором Like - PullRequest
0 голосов
/ 02 марта 2019

У меня проблема с типом MySQL json.Я хочу искать в MySQL массив JSON и получить строки.Мои данные json это

{
    "id": 361,
    "email": "example@outlook.com",
    "code": null,
    "username": null,
    "permissions": null,
    "created_at": "2019-03-01 16:09",
    "updated_at": "2019-03-01 16:09",
    "user_profile": {
        "id": 361,
        "name": "Jhon",
        "surname": "Doe",
        "father_name": "NED",
        "birthday": "1994-12-15",
        "fin_code": "6A56BS7",
        "ssn": "AAA12830157",
        "account_number": "account123",
        "country": "USA",
        "city": "NEW YORK",
        "address": "EXample r",
        "address_n": "Khani/Bina",
        "mobile_phone": "(($717865643",
        "phone": "0123456789",
        "additional_email": "e.example@gmail.com",
        "education": [
            {
                "endDate": "2020-06",
                "startDate": "2015-09",
                "profession": "Computer Since",
                "university": "State University",
                "educationType": 99
            }
        ],
        "language": [
            {
                "id": 102,
                "level": 106
            },
            {
                "id": 103,
                "level": 106
            },
            {
                "id": 104,
                "level": 107
            }
        ],
        "computer_skills": [
            {
                "level": 106,
                "skill": "php"
            },
            {
                "level": 107,
                "skill": "java"
            }
        ],
        "family_composition": [
            {
                "name": "Jhon",
                "level": 126,
                "surname": "Snow",
                "birthday": "1992-02-08",
                "fatherName": "Ned"
            },
            {
                "name": "Jhon",
                "level": 126,
                "surname": "Snow",
                "birthday": "1992-05-18",
                "fatherName": "Ned"
            }
        ],
        "experience": [
            {
                "job": 128,
                "time": 22,
                "level": 8,
                "salary": 2200,
                "jobSign": 128,
                "jobStatus": 267,
                "startDate": "2012-12-12",
                "orderNumber": "123dsa",
                "jobSituation": 273,
                "additionalSalary": 800
            }
        ],
        "reproach": [
            {
                "doc": 228,
                "date": "2011-11-11",
                "note": "Some reason",
                "level": 225,
                "number": "123dsa",
                "reason": "islemir",
                "article": 233
            }
        ],
        "additional_information": "All is work",
        "citizen": {
            "id": 5,
            "name": "United States"
        },
        "cities": {
            "id": 21,
            "name": "New York"
        },
        "countries": {
            "id": 89,
            "name": "Unated States"
        },
        "gender": {
            "id": 1,
            "name": "Man"
        },
        "marital": {
            "id": 4,
            "name": "Single"
        },
        "work": {
            "id": 269,
            "name": "Able"
        },
        "party": {
            "id": 10,
            "name": "Digər"
        },
        "military": {
            "id": 121,
            "name": "OK"
        },
        "institution": null
    }
}

Я хочу искать вот так:

WHERE education.'$[*].profession' Like %Computer%

Но этот синтаксис не работает.Спасибо за ответ.Я разработал свой проект в Laravel 5.7, если это поможет для любого предложения.Я не использую JSON_SEARCH(), потому что эта функция возвращает ключ, но мне нужно вернуть строки для моего поискового запроса.

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Протестировано с MySQL 5.7:

SELECT 'found it!' FROM whatever_your_table_name_is 
WHERE whatever_your_column_name_is->>'$.user_profile.education[*].profession' 
  LIKE '%Computer%';

Вывод, показывающий, что предложение WHERE соответствует документу:

+-----------+
| found it! |
+-----------+
| found it! |
+-----------+

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

0 голосов
/ 12 марта 2019

Я нашел это решение, и оно сработало для меня:

UPPER(education->"$[*].profession") LIKE UPPER("% Computer %")

Для синтаксиса Laravel я пишу код PHP так:

$query=$query->whereRaw('UPPER(education->"$[*].profession") LIKE UPPER("%' . $profession . '%")');
0 голосов
/ 02 марта 2019

Если вы используете MySQL 5.7, это должно работать

.....WHERE JSON_EXTRACT(education , "$.profession") Like '%Computer%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...