Python-da Elaqe Cedveli vasitesile Elaqelendirme
Indi tutaq ki, user muxtelif seherlerde olub. Bu halda userler cedveli asagidaki formada ola biler:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Aydindır ki, melumatları bu formada saxlamaq duzgun deyil - seherleri ayrı bir cedvele çıxarmaq lazımdır. Budur o cedvel:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Ancaq, biz etmeliyik ki, her bir user bir neçe sehere istinad ede bilsin. Iki cedvelleden istifade etmekle bunu etmek mümkin deyil.
Bizim sözdə elaqe cedveli tətbiq etmeye ehtiyacımız var, hansı ki, useri onun seherleri ile elaqelendirecek.
Bu cedvelin her bir qeydinde user ile bir seher arasında elaqe saxlanılacaq. Bununla belə, bir user üçün bu cedvelde neçe seherde olubsa, o qeder de qeyd olacaq.
Budur bizim elaqe cedvelimiz:
| 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 |
Userler cedveli yalnız userlerin adlarını, elaqesiz saxlayacaq:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Sorğular
Gelin sorğu edek, onun vasitesile userleri onların seherleri ile birlikde çıxaraq. Bunun üçün bizim iki join etmeye ehtiyacımız olacaq: ilk join userlere elaqe cedvelini qoşacaq, ikinci join ise elaqeler vasitesile seherleri qoşacaq:
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
Sorğunun Neticesi
Python-da sorğumuzun neticesi her bir userin adını neçe defe, neçe seherle elaqeli olduğu qeder ehtiva edecek:
{'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}
Belə bir lüğeti çevirmek ve onu aşağıdakı formaya salmaq daha rahat olardı:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Belə bir çevirmeni yerine yetiren kodu yazaq.
Boş bir lüğet user_cities_dct yaradaq,
icine userler ve onların olduğu seherler haqqında melumatları
tedricen daxil edeceyik.
for dövründə iki dəyişən elan edirik
user_name ve city_name, hansılarında
userin adı ve seherin adı saxlanılacaq. Daha sonra şerti yazırıq - əgər
user user_cities_dct içinde yoxdursa, onda o
bu lüğete açar kimi əlavə olunacaq.
Həmçinin şerti qeyd edirik ki, əgər city_name
None deyilsə, onda o açarın dəyəri kimi əlavə olunacaq:
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)
Praktiki Tapşırıqlar
Tutaq ki, mehsul bir neçe kateqoriyaya aid ola bilər. Saxlama quruluşunu izah edin.
Mehsulları onların kateqoriyaları ile birlikde çıxaran sorğunu yazın.
Alınan melumatları ul siyahısı şəklində çıxarın,
elə ki, her bir li içinde
evvelə mehsulun adı dur sun, sonra isə
iki nöqteden sonra vergülle ayrılmış şəkildə bu mehsulun
kateqoriyaları sıralansın. Təxminən belə:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>