• 16-07-2023, 15:05:54
    #1
    Öncelikle Merhaba, sql ile bir kod hakkında yardım istiyorum.

    İki tane db tablusu var biri user_roles ve diğeri user_permissions.
    user_roles tablosunda id, name ve iç içe geçmiş json lardan olşuşan permissions sütunu var bu sütun "[{"id":1,"read":1,"write":1,"create":1},{"id":2,"re ad":1,"write":1,"create":1}]" şeklinde
    user_permissions tablosunda ise id ve name sütunları bulunmakta
    şimdi şöyle bir durum var bu user_roles tablosundaki permissions sütunudaki json verisinin içindeki id leri user_permissions tablosundaki id ile eşleşip user_permissions tablosundaki name verisini çekmek istiyorum.

    burdaki amaç bir html tablomuz var user_permissions diye ve bu tabloya tanımlı rolleri user_roles tablosundan çektirmeye çalışıyorum.

    bu kodu,

    tüm permleri foreach ile listeleyip daha sonra ikinci bir sorgu yazarak tüm rolleri çekip if ile koşullayabilirim ama sistemin daha seri bir şekilde çalışmasını isteyip kafa karışıklığı yaratmak istemiyorum.

    user_permissions tablosu;

    user_roles tablosu;
  • 16-07-2023, 15:15:03
    #2
    Eğer json alanlar json şekilde seçildiyse bu kod işinize yarayabilir.
    SELECT user_roles.id, user_roles.name, CASE WHEN json_permissions.permission_id IS NULL OR user_permissions.name IS NULL THEN NULL ELSE COALESCE( JSON_ARRAYAGG( JSON_OBJECT( 'id', json_permissions.permission_id, 'name', user_permissions.name ) ), JSON_ARRAY() ) END AS permissions FROM user_roles LEFT JOIN JSON_TABLE(user_roles.permissions, '$[*]' COLUMNS( permission_id INT PATH '$.id') ) AS json_permissions ON json_permissions.permission_id IS NOT NULL LEFT JOIN user_permissions ON json_permissions.permission_id = user_permissions.id GROUP BY user_roles.id, user_roles.name;
    *Benzer bir işlemi kendi projemde bu şekilde yapmıştım.
  • 16-07-2023, 19:09:45
    #3
    TahaKocak adlı üyeden alıntı: mesajı görüntüle
    Eğer json alanlar json şekilde seçildiyse bu kod işinize yarayabilir.
    SELECT user_roles.id, user_roles.name, CASE WHEN json_permissions.permission_id IS NULL OR user_permissions.name IS NULL THEN NULL ELSE COALESCE( JSON_ARRAYAGG( JSON_OBJECT( 'id', json_permissions.permission_id, 'name', user_permissions.name ) ), JSON_ARRAY() ) END AS permissions FROM user_roles LEFT JOIN JSON_TABLE(user_roles.permissions, '$[*]' COLUMNS( permission_id INT PATH '$.id') ) AS json_permissions ON json_permissions.permission_id IS NOT NULL LEFT JOIN user_permissions ON json_permissions.permission_id = user_permissions.id GROUP BY user_roles.id, user_roles.name;
    *Benzer bir işlemi kendi projemde bu şekilde yapmıştım.
    @TahaKocak; sayesinde işim çözülmuştür teşekkürler.