PHPda bog‘lanishlar jadvali orqali bog‘lanish
Endi foydalanuvchi turli shaharlarda bo‘lgan deylik. Bunday holda, foydalanuvchilar jadvali quyidagicha ko‘rinishi mumkin edi:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Ma'lumki, ma'lumotlarni shu tarzda saqlash noto‘g‘ri - shaharlarni alohida jadvalga chiqarish kerak. Mana u:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Biroq, biz har bir foydalanuvchi bir nechta shaharga murojaat qilishi uchun qilishimiz kerak. Buni ikkita jadval yordamida amalga oshirib bo‘lmaydi.
Bizga bog‘lanishlar jadvali deb ataladigan narsani kiritish kerak bo‘ladi, u foydalanuvchini uning shaharlari bilan bog‘lab turadi.
Ushbu jadvalning har bir yozuvida foydalanuvchi va bitta shahar o‘rtasidagi bog‘lanish saqlanadi. Bunda, bitta foydalanuvchi uchun bu jadvalda u qancha shaharda bo‘lgan bo‘lsa, shuncha yozuv bo‘ladi.
Mana bizning bog‘lanishlar jadvalimiz:
| 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 |
Foydalanuvchilar jadvali faqat foydalanuvchilar ismlarini, bog‘lanishlarsiz saqlaydi:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
So‘rovlar
Keling, foydalanuvchilarni ularning shaharlari bilan birga olib keladigan so‘rov yasaylik. Buning uchun bizga ikkita join kerak bo‘ladi: birinchi join foydalanuvchilarga bog‘lanishlar jadvalini qo‘shadi, ikkinchi join esa bog‘lanishlar orqali shaharlarni qo‘shadi:
SELECT
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
So‘rov natijasi
PHPda bizning so‘rovimizning natijasi har bir foydalanuvchi nomini, u qancha shahar bilan bog‘langan bo‘lsa, shuncha marta o‘z ichiga oladi:
<?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'],
];
?>
Bunday massivni konvertatsiya qilib, uni quyidagiga aylantirish qulayroq bo‘lardi:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Keling, bunday konvertatsiyani bajaradigan kodni yozamiz:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Amaliy vazifalar
Mahsulot bir nechta toifalarga tegishli bo‘lishi mumkin deylik. Saqlash tuzilishini yozib bering.
Mahsulotlarni ularning toifalari bilan birga olib keladigan so‘rovni yozing.
Olingan ma'lumotlarni ul ro‘yxati ko‘rinishida chiqaring,
har bir lida avval mahsulot nomi, keyin ikki nuqtadan
so‘ng vergul bilan ajratilgan holda o‘sha mahsulotning toifalari
keltirilsin.
Taxminan shunday:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>