Pautan Melalui Jadual Pautan dalam Python
Katakan sekarang pengguna pernah berada di bandar yang berbeza. Dalam kes ini, jadual pengguna mungkin mempunyai rupa berikut:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Jelas bahwa menyimpan data sedemikian adalah salah - bandar perlu diasingkan ke dalam jadual berasingan. Inilah jadualnya:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Walau bagaimanapun, kita perlu memastikan bahawa setiap pengguna boleh merujuk kepada beberapa bandar. Dengan dua jadual sahaja, ini mustahil dilakukan.
Kita perlu memperkenalkan apa yang dipanggil jadual pautan, yang akan menghubungkan pengguna dengan bandar-bandarnya.
Dalam setiap catatan jadual ini, akan disimpan pautan antara seorang pengguna dan satu bandar. Dengan itu, untuk satu pengguna, akan terdapat banyak catatan dalam jadual ini, sebanyak bandar yang telah dia kunjungi.
Inilah jadual pautan kami:
| 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 |
Jadual pengguna akan menyimpan hanya nama pengguna, tanpa pautan:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Pertanyaan
Mari buat pertanyaan, yang dengannya kita akan mengambil pengguna bersama bandar mereka. Untuk ini, kita perlu melakukan dua sambungan: sambungan pertama akan menyambung jadual pautan kepada pengguna, dan sambungan kedua melalui pautan akan menyambung bandar:
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
Keputusan Pertanyaan
Keputusan pertanyaan kami dalam Python akan mengandungi nama setiap pengguna sebanyak kali berapa banyak bandar yang dia hubungkan:
{'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'}
{'user_name': 'user5', 'city_name': None}
Lebih mudah untuk menukar kamus sedemikian dan mengubahnya menjadi yang berikut:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Mari tulis kod yang melakukan penukaran sedemikian.
Kami akan buat kamus kosong user_cities_dct,
yang akan kami masukkan data secara beransur-ansur
tentang pengguna dan bandar yang pernah mereka kunjungi.
Dalam gelung for kami isytiharkan dua pembolehubah
user_name dan city_name, di
mana nama pengguna dan nama
bandar akan disimpan. Seterusnya, kami tentukan syarat - jika
pengguna tiada dalam user_cities_dct, maka dia
akan ditambah ke dalam kamus ini sebagai kunci.
Kami juga nyatakan syarat, bahawa jika city_name
bukan None, maka ia akan ditambah sebagai nilai
kunci:
result = cursor.fetchall()
user_cities_dct = {}
for row in result:
user_name = row['user_name']
city_name = row['city_name']
if user_name not in user_cities_dct:
user_cities_dct[user_name] = []
if city_name is not None:
user_cities_dct[user_name].append(city_name)
print(user_cities_dct)
Tugas Praktikal
Katakan satu produk boleh tergolong dalam beberapa kategori. Terangkan struktur penyimpanan.
Tulis pertanyaan yang akan mengambil produk bersama kategori mereka.
Paparkan data yang diperoleh dalam bentuk senarai
ul supaya dalam setiap li
pertama sekali berdiri nama produk, dan selepas
titik bertindih disenaraikan
kategori produk ini. Secara kasar seperti ini:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>