⊗pyPmDOLVT 125 of 129 menu

Python'догу байланыш таблицасы аркылуу байланыштуулук

Эми колдонуучу ар кайсы шаарларда болду деп коёлу. Бул учурда колдонуучулар таблицасы төмөнкүдөй көрүнүшкө ээ болушу мүмкүн:

колдонуучулар
id аты шаары
1 колдонуучу1 шаар1, шаар2, шаар3
2 колдонуучу2 шаар1, шаар2
3 колдонуучу3 шаар2, шаар3
4 колдонуучу4 шаар1

Маалыматтарды ушундай сактоо туура эмес экени түшүнүктүү - шаарларды өзүнчө таблицага чыгарыш керек. Мына ал:

шаарлар
id аты
1 шаар1
2 шаар2
3 шаар3

Бирок, биз ар бир колдонуучу бир нече шаарга шилтеме бере алышы үчүн жасашыбыз керек. Эки таблицанын жардамы менен муну жасап болбойт.

Бизге колдонуучуну анын шаарлары менен байланыштырган деп аталуучу байланыш таблицасы киргизишибиз керек.

Бул таблицанын ар бир жазуусунда колдонуучу менен бир шаардын ортосундагы байланыш сакталат. Бул учурда бир колдонуучу үчүн бул таблицада ал канча шаарда болсо, ошончо жазуу болот.

Мына биздин байланыш таблицабыз:

колдонуучулар_шаарлар
id колдонуучу_id шаар_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 аты
1 колдонуучу1
2 колдонуучу2
3 колдонуучу3
4 колдонуучу4
5 колдонуучу5

Сурамдар

Келгиле, колдонуучуларды алардын шаарлары менен чогуу алып чыга турган сурам жасайлы. Бул үчүн бизге эки джоин керек болот: биринчи джоин колдонуучуларга байланыш таблицасын кошот, ал эми экинчи джоин байланыштар аркылуу шаарларды кошот:

SELECT колдонуучулар.аты as колдонуучу_аты, шаарлар.аты as шаар_аты FROM колдонуучулар LEFT JOIN колдонуучулар_шаарлар ON колдонуучулар_шаарлар.колдонуучу_id=колдонуучулар.id LEFT JOIN шаарлар ON колдонуучулар_шаарлар.шаар_id=шаарлар.id

Сурамдын натыйжасы

Биздин сурамбыздын Python'догу натыйжасы ар бир колдонуучунун атын ал канча шаар менен байланышкан болсо, ошончо жолу камтыйт:

{'колдонуучу_аты': 'колдонуучу1', 'шаар_аты': 'шаар1'} {'колдонуучу_аты': 'колдонуучу1', 'шаар_аты': 'шаар2'} {'колдонуучу_аты': 'колдонуучу1', 'шаар_аты': 'шаар3'} {'колдонуучу_аты': 'колдонуучу2', 'шаар_аты': 'шаар1'} {'колдонуучу_аты': 'колдонуучу2', 'шаар_аты': 'шаар2'} {'колдонуучу_аты': 'колдонуучу3', 'шаар_аты': 'шаар2'} {'колдонуучу_аты': 'колдонуучу3', 'шаар_аты': 'шаар3'} {'колдонуучу_аты': 'колдонуучу4', 'шаар_аты': 'шаар1'} {'колдонуучу_аты': 'колдонуучу5', 'шаар_аты': None}

Мындай сөздүктү конвертациялоо жана төмөнкүгө айлантуу кандайдыр бир ыңгайлуу болмок:

{ 'колдонуучу1': ['шаар1', 'шаар2', 'шаар3'], 'колдонуучу2': ['шаар1', 'шаар2'], 'колдонуучу3': ['шаар2', 'шаар3'], 'колдонуучу4': ['шаар1'], 'колдонуучу5': [] }

Мынай конвертацияны аткарган код жазалы. Бош сөздүк колдонуучу_шаарлар_сз жасайлы, ага биз колдонуучулар жана алар барган шаарлар жөнүндөгү маалыматтарды басан-басан киргизе беребиз. for циклинде эки өзгөрмө колдонуучу_аты жана шаар_аты жарыялайбыз, аларда колдонуучунун аты жана шаардын аты сакталат. Андан кийин шарт жазабыз - эгерде колдонуучу колдонуучу_шаарлар_сз ичинде жок болсо, анда ал ушул сөздүккө ачкыч катары кошулат. Ошондой эле, эгер шаар_аты None эмес болсо, анда ал ачкычтын мааниси катары кошула тургандыгын көрсөтөбүз:

натыйжа = курсор.fetchall() колдонуучу_шаарлар_сз = {} for катар in натыйжа: колдонуучу_аты = катар['колдонуучу_аты'] шаар_аты = катар['шаар_аты'] if колдонуучу_аты not in колдонуучу_шаарлар_сз: колдонуучу_шаарлар_сз[колдонуучу_аты] = [] if шаар_аты is not None: колдонуучу_шаарлар_сз[колдонуучу_аты].append(шаар_аты) print(колдонуучу_шаарлар_сз)

Практикалык тапшырмалар

Бир товар бир нече категорияларга таандык болушу мүмкүн деп коёлу. Сактоо структурасын жазып чыккыла.

Товарларды алардын категориялары менен чогуу алып чыга турган сурам жазыңыз.

Алынган маалыматтарды ul тизмеси түрүндө чыгаргыла, ар бир li тегинде алдымен продукттун аты турушсун, андан кийин эки нуктан кийин үтүр менен айрылып ушул продукттун категориялары тизмеленсин. Болжол менен мындай:

<ul> <li>продукт1: категория1, категория2, категория3</li> <li>продукт2: категория1, категория3</li> <li>продукт3: категория1</li> </ul>
Кыргызча
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어LietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Биз сайттин иштөөсү, аналитика жана персонализация үчүн cookie файлдарын колдонобуз. Маалыматтарды иштетүү Маалыматты коргоо саясаты боюнча жүргүзүлөт.
баарын кабыл алуу ыңгайлаштыруу четке кагуу