⊗pyPmDOLVT 125 of 129 menu

Menghubungkan Melalui Tabel Hubungan di Python

Misalkan sekarang seorang pengguna pernah berada di berbagai kota. Dalam kasus ini, tabel pengguna mungkin terlihat seperti berikut:

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

Jelas bahwa menyimpan data seperti ini tidak benar - kota perlu dipindahkan ke tabel terpisah. Ini dia:

cities
id name
1 city1
2 city2
3 city3

Namun, kita perlu memastikan bahwa setiap pengguna dapat merujuk ke beberapa kota. Dengan dua tabel, hal ini tidak mungkin dilakukan.

Kita perlu memperkenalkan yang disebut tabel hubungan, yang akan menghubungkan pengguna dengan kota-kotanya.

Dalam setiap catatan tabel ini akan disimpan hubungan antara satu pengguna dan satu kota. Sementara itu, untuk satu pengguna di tabel ini akan ada sebanyak catatan kota yang pernah dikunjunginya.

Ini dia tabel hubungan kita:

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

Tabel pengguna hanya akan menyimpan nama pengguna, tanpa hubungan:

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

Kueri

Mari buat kueri yang akan mengambil pengguna bersama dengan kota-kota mereka. Untuk ini, kita perlu melakukan dua join: join pertama akan menggabungkan tabel hubungan ke pengguna, dan join kedua melalui hubungan akan menggabungkan kota:

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

Hasil Kueri

Hasil kueri kita di Python akan berisi nama setiap pengguna sebanyak kota yang terkait dengannya:

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

Akan lebih mudah untuk mengonversi kamus seperti itu dan mengubahnya menjadi berikut:

{ 'user1': ['city1', 'city2', 'city3'], 'user2': ['city1', 'city2'], 'user3': ['city2', 'city3'], 'user4': ['city1'], 'user5': [] }

Mari tulis kode yang melakukan konversi seperti itu. Kita buat kamus kosong user_cities_dct, di mana kita akan secara bertahap memasukkan data tentang pengguna dan kota yang pernah mereka kunjungi. Dalam loop for kita deklarasikan dua variabel user_name dan city_name, di mana akan disimpan nama pengguna dan nama kota. Selanjutnya, kita tentukan kondisi - jika pengguna tidak ada di user_cities_dct, maka dia akan ditambahkan ke kamus ini sebagai kunci. Kita juga tentukan kondisi, bahwa jika city_name bukan None, maka itu akan ditambahkan 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 Praktis

Misalkan sebuah produk dapat termasuk dalam beberapa kategori. Jelaskan struktur penyimpanannya.

Tulis kueri yang akan mengambil produk bersama dengan kategorinya.

Tampilkan data yang diperoleh dalam bentuk daftar ul sedemikian rupa sehingga di setiap li pertama-tama tertulis nama produk, dan setelah titik dua, dipisahkan dengan koma, dicantumkan kategori produk tersebut. Kira-kira seperti ini:

<ul> <li>product1: category1, category2, category3</li> <li>product2: category1, category3</li> <li>product3: category1</li> </ul>
Indonesia
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Kami menggunakan cookie untuk operasi situs, analitik, dan personalisasi. Pemrosesan data dilakukan sesuai dengan Kebijakan Privasi.
terima semua atur tolak