PHP တွင် ဆက်သွယ်မှုဇယားမှတစ်ဆင့် ချိတ်ဆက်ခြင်း

ယခု user သည် မြို့များစွာတွင် ရှိခဲ့သည်ဆိုပါစို့။ ဤအခြေအနေတွင် user များပါဝင်သော ဇယားသည် အောက်ပါပုံစံရှိနိုင်သည်။

users
id name city
1 user1 city1, city2, city3
2 user2 city1, city2
3 user3 city2, city3
4 user4 city1

ဒေတာများကို ဤနည်းဖြင့် သိမ်းဆည်းရန် မမှန်ကန်ကြောင်း နားလည်ရမည် - မြို့များကို သီးခြားဇယားတစ်ခုသို့ ခွဲထုတ်ရမည်။ ထိုဇယားမှာ ဤသို့ဖြစ်သည်။

cities
id name
1 city1
2 city2
3 city3

သို့ရာတွင်၊ user တစ်ဦးစီသည် မြို့များစွာကို ညွှန်းဆိုနိုင်ရန် လုပ်ဆောင်ရမည်။ ဇယားနှစ်ခုဖြင့် ဤသို့လုပ်ဆောင်ရန် မဖြစ်နိုင်ပါ။

ကျွန်ုပ်တို့သည် ခေါ်ဆိုသော ဆက်သွယ်မှုဇယား ကို ထည့်သွင်းရန် လိုအပ်သည်၊ ၎င်းသည် user ကို ၎င်း၏မြို့များနှင့် ချိတ်ဆက်ပေးမည်ဖြစ်သည်။

ဤဇယားရှိ မှတ်တမ်းတစ်ခုစီတွင် user နှင့် မြို့တစ်မြို့အကြား ဆက်သွယ်မှုကို သိမ်းဆည်းမည်။ ဤသို့ဖြင့် user တစ်ဦးအတွက် ဤဇယားတွင် သူရှိခဲ့သော မြို့အရေအတွက်အတိုင်း မှတ်တမ်းများ ရှိမည်။

ကျွန်ုပ်တို့၏ ဆက်သွယ်မှုဇယားမှာ ဤသို့ဖြစ်သည်။

users_cities
id user_id city_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 3 2
7 3 3
8 4 1

User များပါဝင်သော ဇယားသည် user အမည်များကိုသာ သိမ်းဆည်းမည်၊ ဆက်သွယ်မှုများ မပါဝင်ပါ။

users
id name
1 user1
2 user2
3 user3
4 user4
5 user5

Query များ

User များကို ၎င်းတို့၏မြို့များနှင့်အတူ ထုတ်ယူနိုင်မည့် query တစ်ခုကို လုပ်ဆောင်ကြပါစို့။ ထိုသို့လုပ်ဆောင်ရန် join နှစ်ခု လိုအပ်မည်။ ပထမ join သည် user များထံသို့ ဆက်သွယ်မှုဇယားကို ချိတ်ဆက်မည်၊ ဒုတိယ join သည် ဆက်သွယ်မှုများမှတစ်ဆင့် မြို့များကို ချိတ်ဆက်မည်။

sqlSELECT
  users.name as user_name, cities.name as city_name
FROM
  users
LEFT JOIN users_cities ON users_cities.user_id=users.id
LEFT JOIN cities ON users_cities.city_id=cities.id

Query ၏ ရလဒ်

PHP တွင် ကျွန်ုပ်တို့၏ query ၏ ရလဒ်သည် user တစ်ဦးစီ၏ အမည်ကို ၎င်းသည် မည်မျှသော မြို့များနှင့် ဆက်သွယ်ထားသည်ဆိုသည့် အကြိမ်အရေအတွက်အတိုင်း ပါဝင်မည်။

php<?php
  $arr = [
    ['user_name' => 'user1', 'city_name' => 'city1'],
    ['user_name' => 'user1', 'city_name' => 'city2'],
    ['user_name' => 'user1', 'city_name' => 'city3'],
    ['user_name' => 'user2', 'city_name' => 'city1'],
    ['user_name' => 'user2', 'city_name' => 'city2'],
    ['user_name' => 'user3', 'city_name' => 'city2'],
    ['user_name' => 'user3', 'city_name' => 'city3'],
    ['user_name' => 'user4', 'city_name' => 'city1'],
  ];
?>

ထိုကဲ့သို့သော array ကို ပြောင်းလဲပြီး အောက်ပါအတိုင်း ဖြစ်အောင်လုပ်ရန် ပိုမိုအဆင်ပြေမည်။

php<?php
  $res = [
    ['user1' => ['city1', 'city2', 'city3']],
    ['user2' => ['city1', 'city2']],
    ['user3' => ['city2', 'city3']],
    ['user4' => ['city1']],
  ];
?>

ထိုကဲ့သို့သော ပြောင်းလဲမှုကို လုပ်ဆောင်သော code ကို ရေးကြပါစို့။

php<?php
  $res = [];
  
  foreach ($data as $elem) {
    $res[$elem['user_name']][] = $elem['city_name'];
  }
  
  var_dump($res);
?>

လက်တွေ့လေ့ကျင့်ခန်းများ

Задание 1

ထုတ်ကုန်တစ်ခုသည် ကဏ္ဍများစွာတွင် ပါဝင်နိုင်သည်ဆိုပါစို့။ သိမ်းဆည်းမှု ဖွဲ့စည်းပုံကို ရေးချပါ။

Задание 2

ထုတ်ကုန်များကို ၎င်းတို့၏ကဏ္ဍများနှင့်အတူ ရယူနိုင်မည့် query တစ်ခုကို ရေးပါ။

Задание 3

ရရှိသော ဒေတာများကို စာရင်း ul ပုံစံဖြင့် ထုတ်ပြပါ၊ ထိုသို့ဖြစ်စေရန် ပထမဦးစွာ ထုတ်ကုန်၏အမည်ကို li တစ်ခုစီတွင် ထားရှိပြီး နှစ်ကွက်မှတ်ပြီးနောက် ထိုထုတ်ကုန်၏ ကဏ္ဍများကို ကော်မာဖြင့် ခွဲခြားဖော်ပြပါ။ ဥပမာအားဖြင့် ဤသို့ဖြစ်သည်။

html<ul>
  <li>product1: category1, category2, category3</li>
  <li>product2: category1, category3</li>
  <li>product3: category1</li>
</ul>