Salamlar. mysql də select order by Azərbaycan əlifbasına görə sıra sıralamanı hansı yolnan eləmək olar?
normalda order by collate charset verməklə edilir ama azərbaycan charseti yoxdu mysql də. utf8_turkish_ci var oda bizim əlifbanı düz sıralamır. 1-2 yol fikirləşib elədim ama tam nəticə vermədi. bir table yaradıb letter order sutunlari olan. Azərbycan hərflərini həmən cədvəldə məs azeri_letters saxlayıb order də sıralamanı verib hər hər hansı başqa cədvəli select eləyəndə ilk hərfi substr eləyib azeri_letter ile join edib order i vermək. burda ama ilk hərfləri sıralayır. ama 2 və sonrakı hərflərdə uje qarışır. Nə təklif edə bilərsiniz bunun üçün. Təşəkkürlər
Verilmiş cavablar və yazılan şərhlər (15 cavab var)
1
Multibyte charsetlər var mysql-də.
Məs. istifadə elədiyim charset – utf8mb4_unicode_520_ci
0
Təşəkkürlər. Bunu order eləyəndə collate olaraq vermeəliyəm yoxsa table ları yaradanda charset olaraq da bunu verməliyəm?
0
Yox query-də heç bir şey etmək lazım deyil. Adicə default orderby işləyər. Sadəcə mysqldə lazımi sütunu yaradarkən düzgün chatset seçmək bəs edər
0
Alınmadı ama. table create query aşağıdakı kimidir. select query də qeyd edirəm aşağıda.
ə ı ü ş ğ bu hərfləri düzgün sıralaylr ama hansl ki ingilis əlifbası ilə eyni olan lakin bizde orderi fərqli olan hərfləri ingilis əlifbasına görə sıralayır. Məsələn x h dan sonra gəlməlidi ama sonda y dən əvvəl gəlir
Mysql version mysql Ver 8.0.19 for osx10.15 on x86_64
0
Bəlkə output nümunə qoyasınız daha aydın olsun deyə.
Azərbaycan əlifbasının spesifikasını mysql bilmir deyə ola bilər belə kiçik fərq. Amma yenə də output sample görsəm daha çox demək olar.
0
Sample data ve query burda əlavə etmişem
həm tək hərfləri order verəndə düz çıxmır həmdə datanı.
1
İndi aydındır.
X hərfi ilə yanaşı yəqin ki problem Q hərfi ilə də olacaq.
Burada təqsir mysql charsetdə yox, bizim əlifbadadır. Ümumi latın ardıcıllıq prinsipinə riayət edilməyib deyə, xüsusi azeri charset olmadan q və x hərfləri həll olmaz.
Sizin hal üçün alternativ kimi iki həll demək olar.
1. mysql-də bir rəqəm sütunu yaradın, kod tərəfdə də hər kəsin adının baş hərfini ora yazmaq, əlifbamızdakı tutduğu mövqeyə uyğun Məsələn Əli – 7, Ayxan – 1, Bənövşə, 2 və.s.
Ondan sonra da orderby-ı həmin sütuna görə vermək.
2. Bir də mysql-in özü ilə daha sadə yolla həll etmək. FIELD() funksiyası ilə.
Məsələn,
Siz nümunədəki ‘A’, ‘B’, ‘C’, ‘Ç’ əvəzinə tam əlifbanı yazmalısınız təbii ki.
Belə olan halda mysql məcbur qalacaq ki sırf sizin custom sıralama ilə orderby eləsin.
0
Çox təşəkkür edirəm izah üçün. Bəli problem bizim əlifbanın ingilis əlifbasına nisbətən hansı hərf orderi fərqlidirsə problem həmən hərflərdə baş verir. Qeyd etdiyiniz üsul ilə eləmişdim. Düzdü sıralayır ama sadecə ilk hərflə görə. Normalda mysql özü order eləyəndə sözdə olan hərflərin levellara görə order edir. İlk hərf eynidirsə keçir 2 ci hərfləri müqayisə edir. Ama bu numunələrdə ilk hərfi eyni olan 2 ci hərfi deyək ki x olan digər 2 ci hərfi m olan sözdən sonra gələcək. Halbu ki əvvəl gəlməlidi. Başqa bir variant gəlib ağlıma ama test etməmişəm bilmirəm nə dərəcədə effektiv olar. Test edib nəticəni yazacam
1
Əgər söhbət ədəd analoq sütundan gedirsə və hər ad üçün çəki müəyyən edilirsə, o da çox asandır, yəni bütöv söz üzrə orderby.
Mən yuxarıda yazan nümunədə funksiya score-u belə hesablayırdi
Ilk hərf = sıra nömrəsi.
Onun əvəzində başqa funksiya edə bilərsiz, kiçik sadə php funksiya.
Ilk hərf = 32*SIRA
Ikinci hərf = 32*SIRA/33
Üçüncü hərf = 32*SIRA/(33*33)
Və.s.
Alınan ədədlərin uzun yazılışli olmaması üçün hər hansı riyazi normalisation operator funksiyası da istifadə etmək olar. Ki store ediləcək ədəd uzun kəsr və ya çox böyük ədəd olmasın.(performansi salmamaq üçün)
0
Belə bir yolla elədim. Düzgün sıralayır. string tipinde bir order column yaradırıq table da.
elementi save və update eləyəndə ad sahəsini aşağıdakı funksiyada keçirib nəticəni set edirəm order ə və select eləyəndə orderə görə sıralayıram.
bir neçə dəfə test elədim səhf nəticə verən halla rastlaşmadım.
0
Salam. Bir müddət əvvəl sizin dediyiniz kimi elemişdim və həll etmişdi problemi, ama indi baxıram ki bəzi yerlerdə düzgün sıralamır.Funksiya belədir.
Məsələn
İsmayılova Ülviyyə İbrahim
İsmayılova Möminə Nizam
bu adları sıralayanda soyad eynidi deyə adlara keçir və M Ü dən öncə gəlməlidir ama düz sıralamır nədənsə.
orderi tapmaq üçün ad soyad ata adini oldugu kimi göndərirən funksiyaya.
1
POW funksiyasında problem görürəm, artıqca düzgün hesablanmır. Uzun string üçün düzgün tətbiq edilməyib qısacası. Verdiyiniz iki ad soyadın order score-u tamamilə eyni alınır. Həm də 33pow34 kimi nəhəng ədədlər process edilir ki bu da heç yaxşı deyil calculation speed baxımdan.
Mən indi pow-u əvəz elədim cəm operatoru ilə.
Kodu və nəticəni paylaşıram
Output:
80.460855739996
64.516014812369
63.070509310542
511.35933715211
510.98574532239
514.87697337388
Göründüyü kimi output bu nümunədə verilən 6 ad-soyad üçün tamamilə doğru hesablanır. Ən kiçik 63-dür, Abbasova L.
Ən böyük isə 514 , İsmayılova Ü.
0
Əla. Problem pow funksiyasında imiş. Ağlıma gəlməyib düzü. Test etdim xeyli data ilə tamamilə düzgün işlədi. Minnətdaram.
0
Mən yazdığım kimi eləyəndə stabil işləmədi. Bir yerlərdə düzgün order eləmir. Sizin qeyd etdiyiniz kimi elədim işlədi tam dəqiq. Təşəkkür edirəm. Çox sağolun. Mysql də column string tipində eləyib order column nu order by verəndə integer ə cast elədim.
0
Çox maraqlı bir hal yaranır. deməli bircə bu adda düzgün sıralamır. Başqa ağlıma gələnhalları yoxladım işləyir düzgün. Aşağıdakı nümunəyə baxın zəhmət olmasa. Hərflər ilə verəndə eyni halı düzgüz sıralayır. Ama ad soyad ata adı verəndə düz sıralamır.
belə düzgün sıralayır
ama bu halda yox.
Sual verin
Cavab verin