Python-da baglanyşyk tablisasy arkaly baglanyşyk
Indi ulanyjynyň dürli şäherlerde bolandygyny göz öňüne getireýäli. Bu ýagdaýda ulanyjylar tablisasy aşakdaky görnüşde bolup biler:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Maglumatlary şeýle saklamak nädogrydygyny düşünmek kyn däl - şäherleri aýratyn tablisada saklamaly. Şu ýerde ol:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Şonda-da, her bir ulanyjynyň birnäçe şähere salgylanýan bolşy ýaly etmeli. Iki tablisa bilen muny etmek mümkin däl.
Bizä söz ýüzi diýen baglanyşyk tablisasy zerur, ol ulanyjyny onuň şäherleri bilen baglar.
Bu tablisanyň her ýazgynda bir ulanyjynyň bir şäher bilen baglanyşygy saklanar. Şol bir wagtyň özünde bir ulanyjy üçin bu tablisada ol näçe şäherde bolsa, şonça ýazgy bolar.
Ine bizim baglanyşyk tablisamyz:
| 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 |
Ulanyjylar tablisasy diňe ulanyjylaryň adyny, baglanyşyklarsyz saklar:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Soraglar
Geliň, ulanyjylary şäherleri bilen bir hatarda çykarmak üçin sorag ýerine ýetireýäli. Bunuň üçin bizä iki birleşme (join) zerur: birinji birleşme ulanyjylara baglanyşyk tablisasyny goşar, ikinji birleşme bolsa baglanyşyklar arkaly şäherleri goşar:
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
Soragyň netijesi
Python-da soragymyzyň netijesi her bir ulanyjynyň adyny, ol näçe şäher bilen baglanyşykly bolsa, şonça gezek öz içine alar:
{'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}
Beýle sözlügi öwürmek we ony aşakdaky görnüşe getirmek has amatly bolar:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Beýle öwürmäni amala aşyrýan kody ýazaýaly.
Boş sözlük user_cities_dct döredeliň, ol ulanyjylar we olaryň bolan şäherleri hakda maglumatlary çalsyz goşup bolar.
for aýlawynda iki üýtgeýji user_name we city_name yglan edeliň, olarda ulanyjynyň ady we şäheriň ady saklanar. Soňra şert ýazalyň - eger ulanyjy user_cities_dct içinde ýok bolsa, ol bu sözlüge açaryň görnüşinde goşular. Şeýle hem, city_name None däl bolsa, onuň açaryň bahasy hökmünde goşuljakdygyny görkezeliň:
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)
Amaly wezipeler
Harydyň birnäçe kategoriýa degişli bolup biljekdigini göz öňüne getireýäli. Saklamanyň gurluşyny ýazyň.
Harytlary kategoriýalary bilen bir hatarda alyp gelýän soragy ýazyň.
Alynan maglumatlary ul sanawy görnüşinde çap ediň, şeýleki her bir li içinde ilki önümiň ady, soňra iki nokatdan soň, üsti bilen, şol önümiň kategoriýalary sanalyp geçilsin. Mysal üçin:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>