2
votes

Recherche Mysql dans le tableau json avec l'opérateur Like

J'ai un problème avec le type json MySQL. Je veux rechercher dans le tableau mysql json et obtenir des lignes. Mon json donne ce

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

Je veux faire une recherche comme ceci:

{
    "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
    }
}

Mais cette syntaxe ne fonctionne pas. Merci d'avoir répondu. J'ai développé mon projet dans Laravel 5.7 si cela aide pour une suggestion. Je n'utilise pas JSON_SEARCH () car cette fonction renvoie la clé mais je dois renvoyer des lignes pour ma requête de recherche.


2 commentaires

D'une part, vous avez besoin de guillemets simples autour du modèle comme : '% Computer%' .


Ceci est un exemple. J'ai écrit correctement dans la requête)


3 Réponses :


2
votes

Si vous êtes sur MySQL 5.7, cela devrait fonctionner

.....WHERE JSON_EXTRACT(education , "$.profession") Like '%Computer%';


0 commentaires

0
votes

Testé avec MySQL 5.7:

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

Sortie, montrant que la clause WHERE correspond au document:

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

Comme pour la plupart des autres questions sur JSON dans MySQL, je pense que vous feriez mieux de stocker les données dans des tables normalisées.


0 commentaires

1
votes

J'ai trouvé cette solution et cela a fonctionné pour moi:

$query=$query->whereRaw('UPPER(education->"$[*].profession") LIKE UPPER("%' . $profession . '%")');

Pour la syntaxe Laravel, j'écris le code PHP comme ceci:

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

p >


0 commentaires