Баркарорӣ тавассути ҷадвали робита дар Python
Бигзор акнун корбар дар шаҳрҳои гуногун буда бошад. Дар ин ҳолат ҷадвали корбарон метавонад шакли зеринро дошта бошад:
| id | ном | шаҳр |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Муайян аст, ки нигоҳ доштани маълумотҳо ба ин тавр нодуруст аст - шаҳрҳоро бояд ба ҷадвали ҷудогона гузошт. Он инҷост:
| id | ном |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Аммо, мо бояд чунон кунем, ки ҳар як корбар тавассути чанд шаҳр даъват карда шавад. Бо истифода аз ду ҷадвал инкор имконнопазир аст.
Ба мо лозим меояд, ки чизе, ки номида мешавад ҷадвали робита, ки корбарро бо шаҳрҳои он пайванд мекунад.
Дар ҳар як сабти ин ҷадвал пайванди байни корбар ва як шаҳр нигоҳ дошта мешавад. Дар ин ҳолат барои як корбар дар ин ҷадвал ин қадар сабт хоҳад буд, ки дар чанд шаҳр ӯ будааст.
Ҷадвали робитаи мо инҷост:
| 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 |
Ҷадвали корбарон танҳо номҳои корбаронро нигоҳ медорад, бе пайвандҳо:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Дархостҳо
Биёед дархостеро созем, ки бо ёрии он корбаронро бо шаҳрҳои онҳо берун кунем. Барои ин ба мо ду джоин лозим аст: аввалин джоин ба корбарон ҷадвали робитаро мепайвандад, ва джоини дуюм тавассути робитаҳо шаҳрҳоро мепайвандад:
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
Натиҷаи дархост
Натиҷаи дархости мо дар Python хоҳад дошт номи ҳар як корбар ин қадар маротиба, ки бо чанд шаҳр пайванд дорад:
{'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}
Мувофиқтар мебуд, ки чунин луғат табдил дода шавад ва ба зерин табдил ёбад:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Кодеро нависем, ки чунин табдилдиҳиро иҷро мекунад.
Луғати холӣ user_cities_dct созем,
ки дар он тадриҷан маълумотҳоро
дар бораи корбарон ва шаҳрҳое, ки онҳо будаанд, ворид кунем.
Дар ҳалқаи for ду тағирёбандаро эълон мекунем
user_name ва city_name, дар
онҳо номи корбар ва номи
шаҳр нигоҳ дошта мешаванд. Баъд шартро менависем - агар
корбар дар user_cities_dct набошад, пас ӯ
ба ин луғат ҳамчун калид илова карда мешавад.
Инчунин шартро нишон медиҳем, ки агар city_name
None набошад, пас он ҳамчун қимати
калид илова карда мешавад:
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)
Вазифаҳои амалӣ
Бигзор маҳсулот ба чанд гурӯҳ тааллуқ дошта бошад. Сохти нигоҳдориро тавсиф кунед.
Дархостеро нависед, ки маҳсулотҳоро бо гурӯҳҳои онҳо мегирад.
Маълумотҳои гирифташударо ҳамчун рӯйхати
ul чоп кунед
ҳамин тавр, ки дар ҳар як li
аввал номи маҳсулот истода бошад, ва пас аз
ду нуқта дар як сатр тавассути вергул гурӯҳҳои
ин маҳсулот рӯйхат карда шаванд. Тақрибан ҳамин тавр:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>