Printable Version of Topic
Click here to view this topic in its original format |
თბილისის ფორუმი > DB Programming > ქუერი ვერ ჩამოვაყალიბე როგორ ვქნა |
Posted by: ShalvaSoft 1 Jun 2016, 23:42 | ||||
მოკლედ მაქვს მესიჯების ცხრილი კოლუმებია id, name, message, IDreply, datereply, datereceived თუ პირველი წერილია მაშინ IDreply უდრის 0 სხვა შემთხვევაში აქ მოდის იმ მესიჯის იდ რომლის რეფლაიც არის მაგალითისთვის
და ა.შ. ეხლა მე მინდა რომ დავასელექტო ყველა რომელსაც აქვს IDreply 0 და ორდერინგი გავუკეთო datereply-ების მიხედვით ანუ რომ გავაკეთებ
მერე მინდა რომ გადაუაროს რეპლაიებს და დაამთხვიოს id IDreply-ებს და მაგის მიხედვით გააკეთოს 0-იანი IDreply-ების ორდერინგი მგონი სწორად ჩამოვაყალიბე ამოცანა მაგრამ გადაწყვეტა ვერ მოვუძებნე სავარაუდოდ LEFT JOIN დაჭირდება ჩემი აზრით მაგრამ ყველას რომ გადაუაროს სათითაოდ ხომ არ ჩამოვწერ ჯოინებს??? ხო და მაგიტომ მინდა რაღაც ლუპისნაირი ოღონდ ქუერიში რომ თავისით მიხვდეს სანამდე აგრძელოს ეგ გთხოვთ რა სასწრაფოდ მჭირდება შემოშველება რა 1 კვირაა ამაზე ვფიქრობ და ერთადერთი გადაწყვეტა რაც მოვუფიქრე php-თი სათითაოდ გადალუპვაა და სათითაო რეპლიების ცალ ცალკე ქუერით ამოღებაა ეს კი დიდ დროსა და რესურს მოითხოვს მე კიდე მინდა პრასტოი ლისტიო გამოვიტანო და მაგდენ ხანს კლიენტი არ დაიცდის ამიტომაც გთხოვთ დახმარებას ვფიქრობ mysql ამას უკეთესად გაუკლავდება... |
Posted by: Dixtosa 2 Jun 2016, 20:00 | ||
me ver gavige. ანუ საწყისი მესიჯის პასუხების მიხედვით გინდა ორდერინგი? რომელი პასუხის ბოლო? |
Posted by: MrAlex 2 Jun 2016, 20:31 |
ShalvaSoft მეც ვერ გავიგე ზუსტად რა გინდა, აი ის 6 სატესტო მონაცემი რომ გაქ , სწორი query-ს შედეგათ როგორი output-ი გინდა რომ ჰქონდეს აი ეგ დაწერე და უფრო გასაგები იქნება. |
Posted by: ShalvaSoft 2 Jun 2016, 21:42 | ||||||
Dixtosa MrAlex ტაკს ეხლა ჩამოვწერ როგორც გადავწყვიტე ეგ პრობლემა php-ით მაგრამ არაა ეგ კაი საქციელი პირველ რიგში ვიღებ ყველა მესიჯს რომელიც ეკუთვნის კონკრეტულ უზერს
მიღებული შედეგის მიხედვით ვიღებ ბოლოს მოსულ მესიჯებს
და ვაკეთებ მაგათი მოსვლის დროების მიხედვით ორდერინგ კლებადობაზე პირველ ფუნქციაში არსებული usort-ით,,,, მერე უკვე დავუყვები და ვპოულობ პირველ მესიჯებს
და აი ამას ვაბრუნებ უკვე ესაა ზუსტი სტრუქტურა ბაზის თუ რამეს ვერ გაუგებთ რა ქუერი იკვრება მაგ [h[-ებით შემიძლია გავშალო... მაგრამ იდეაში ყველაფერი გასაგები უნდა იყოს... |
Posted by: Lilith 2 Jun 2016, 22:09 |
ShalvaSoft თავშივე რომ გაგეთვალისწინებინა უფრო მარტივად გააკეთებდი ამ ყველაფერს. ერთი სვეტი რომ დაუმატო მაგ ცხრილს და ჩაწერო ძირითადი ჩანაწერის id მაგით ეშველება ამ ყველაფერს და შენც არ დაგჭირდება ბაზაში ძებნა. |
Posted by: ShalvaSoft 3 Jun 2016, 00:09 | ||
Lilith
ეგ არ მაწყობს რადგან პირველიუ მესიჯი შეიძლება წაიშალოს და დავრჩები ჰაერში მაგ შემთხვევაში... |
Posted by: Dixtosa 3 Jun 2016, 00:22 |
ShalvaSoft დამალე არ წაშალო :/. რაც შენ გინდა არაა შესაძლებელი რედუნდანსის შემოღების გარეშე. |
Posted by: ShalvaSoft 3 Jun 2016, 00:44 | ||
Dixtosa
ძააბ დიდი ბოდიში ტერმინებში ვერ ვერკვევი შეგიძლია ამიხსნა რედუბდაბსი რა არის??? და რომ არ წავშალო ეგ არ მაწყობს რადგან კლიენტი თუ შლის მაგ მაილს უნდა წაიშალოს როგორც მაილ სერვერზე ასევე ბაზიდანაც თან კონკრეტული სპეისი გვაქვს მიცემუი კონკრეტულ აქაუნთზე და მოკლედ კლიენტმა უნდა ნახოს რამდენი დარჩა და ა.შ. |
Posted by: Roofus 3 Jun 2016, 00:55 |
ShalvaSoft https://en.wikipedia.org/wiki/Redundant_code ზედმეტი კოდი არის რედუნდანსი |
Posted by: ShalvaSoft 3 Jun 2016, 01:22 | ||
Roofus
გასაგებია მადლობა ინფოსთვის მარა ჩემს კოდში რედუნდასი არაა და რავი აბა... როგორ დავიჯერო რომ სქლს იმის გაკეთება არ შეუძლია რაც მე 4 ფუნქციაში გავშალე??? |
Posted by: Roofus 3 Jun 2016, 01:34 | ||
ShalvaSoft
აი ეს არის რედუნდანსი... ანუ 4 ფუნქციაში რომ ატრიალებ ერთ ინფოს... ხო შეიძლება რომ პირდაპირ ის ინფო წამოიღო რაც გჭირდება... მე ზუსტად ვერ გავიგე რა გინდა ამიტომ ვერაფერს გწერ მივხვდი რომ მესიჯების გაფილტვრა გინდა მაგრამ რომელის ვერ გავიგე... ისე შეეცადე ბაზის წყობა შეცვალო ან ბოლო ბოლო 2 ტეიბლად გატეხო... ან კიდე რამე მარკერები შემოიღო + 2 ტეიბლად გატეხო... რავიცი რამე ცვლილება ბაზის ისე რომ შეძლო მარტივად წამოღება იმ ინფოსი რაც გჭირდება |
Posted by: ShalvaSoft 3 Jun 2016, 01:39 | ||||
Roofus
არა კაცო ბაზის სტრუქტურა სწორია მაგაზე უკეთესი წყობა შეუძლებელია
სორტირება მჭირდება რას ვერ მიხვდი??? უნდა ამოვიღო პირველი მესიჯები ოღონდ ორდერინგი უნდა მოხდეს ბოლოს მიღებული მესიჯების დეითებით... |
Posted by: Roofus 3 Jun 2016, 01:44 |
ShalvaSoft და შენც AND გამოიყენე ORDER თან ერთად და მარტო ერთი ROW წამოიღე... არა? WHERE replyID = 0 ORDER by id AND date LIMIT 1 |
Posted by: ShalvaSoft 3 Jun 2016, 10:28 | ||
Roofus
ხო ეგ მარტო usort-ს მოაკლებს დიდ სხვაობას არ მომცემს მაინც მოკლედ... |
Posted by: Ruritania 3 Jun 2016, 13:57 |
ShalvaSoft როგორც მივხვდი, შენს მაგალითში პირველ მესიჯს (bla) არ აქვს reply. მეორე კიდევ პირველის reply არის (bli blu არის bla-ს reply). და გინდა რომ ერთმანეთთან დააკავშირო ესენი ჯოინით და 2 ორდერ გადაატარო - პირველი datereply-ზე და მეორე datereceived-ზე? |
Posted by: ShalvaSoft 3 Jun 2016, 14:04 | ||||
Ruritania
კი ეგრეა ნამდვილად
ხო ხო ანუ რეალურად მე მჭირდება პირველი მესიჯების ამოღება ოღონდ ორდერიუნგი უნდა იყოს ბოლო მესიჯების მოსვლის დროზე |
Posted by: Ruritania 3 Jun 2016, 14:29 | ||||||
თითო მესიჯს მარტო 1 reply ექნება ყოველთვის? ----- ეხლა შევხედე ისევ მაგალითს და nested reply-ები გაქვს, ვნახე. ანუ 0 რომელსაც აქვს, ის არის parent მესიჯი და დანარჩენები მოყვებიან მერე. * * * ასეთ ვარიანტს გავაკეთებდი: გაქვს 2 table. ერთი messages და მეორე replies. replies არის უბრალო pivot table-ი:
და მერე
|
Posted by: Roofus 3 Jun 2016, 16:18 |
მეც ეგ უთხარი, მარკერები დაამატე მეთქი ბაზაში... მარა არაო... არ მინდა ბაზის შეცვლაო... |
Posted by: Ruritania 3 Jun 2016, 16:31 | ||
Roofus მემგონი არც გამოვა არანაირად იმიტომ რომ საბოლოო ჯამში 1 სია უნდა გამოვიდეს და ისე ვერ დაჯგუფდება, ან ძალიან ჩაიხლართება. აი დაახლოებით ასეთ შემთხვევაში:
|
Posted by: stinky 3 Jun 2016, 17:37 |
ასეთი რაღაც გინდა? |
Posted by: ShalvaSoft 3 Jun 2016, 20:12 | ||||
stinky
მეილ კლიენტს ვაწყობ მესენჯერს კი არა შე კაცო... Ruritania
ხო ეგრეა და კაკრას ეგ 0-იანებიანები უნდა ამოვიღო ოღონდ ბოლოს მოსული ნესთიდების მოსვლის დროით უნდა დაისორტოს... მაგის იდეა ისაა რომ ბოლოს თუ მოვიდა რეპლი მესიჯზე რომლის მერე კიდეა მოსული 50 ეს მესიჯი პირველ ადგილზე უნდა ამიწიოს... ანუ სტანდარტული მეილ კლიენტის ვარიანტია.... |
Posted by: Ruritania 3 Jun 2016, 20:53 | ||
ShalvaSoft ხოდა იმ pivot table-ით გააკეთებ თავისუფლად.. მთავარი მესიჯები თუ გინდა რომ წამოიღო (ანუ რომელიც არ არის reply), ასეთ რაღაცას გააკეთებ:
და შემდეგ უკვე რომელიმე მესიჯზე რომ შევა მომხმარებელი (და შესაბამისად id რომ გექნება უკვე რაც გახსნა) იმ ზემოთა query-ში ჩასვამ რაც მოგწერე. და იქედან parentId, parentName, parentMessage შეგიძლია ამოიღო და მარტო reply-ების ლისტი გექნება. თუ ასე იზამ, მაშინ ზუსტად ერთი და იგივენაირი ობჯექტი იქნება თითოეული მესიჯი, არ აქვს მნიშვნელობა parent-ია თუ reply და შესაბამისად 1 კლასი შეგიძლია გქონდეს მარტო.. |
Posted by: ShalvaSoft 3 Jun 2016, 22:22 | ||
Ruritania
ამას არსებულ ტაბლიცათითა ვიზავ LEFT JOIN-ით მარა იმ ბოლო მესიჯებისა და პირველი მესიჯების ამბავია... * * * პროსტო ტაბლიცის გაშლა რატო არ მაწყობს იცი??? მამდ ფოლდერის მიხედვით ვფილტრავ და შეიძლება მარტო 1 წერილი იყოს და შეიძლება 50 რეფლი ქონდეს და ცალ ცალკე ტაბლიცაში ვერ გავში რა... სურათი რომ დავდე სტრუქტურის მაგას შეხედე და მიხვდები |
Posted by: Roofus 3 Jun 2016, 22:55 | ||
ShalvaSoft
სურათი გიდევს ცუდი ხარისხის ძალიან. ტექსტი არ იკითხება |
Posted by: Ruritania 3 Jun 2016, 23:25 | ||||
LEFT JOIN-ით არსებულ ტაბლიცაზე როგორ გამოვა? ერთი მეორის reply გაქვს იქ. და აქ კიდევ 1 parent_id არის და სხვები მიბმულია მასზე და ორდერს აკეთებს თარიღის მიხედვით, (როგორც უნდა იყოს მაილი ზოგადად).. რაც მოგწერე, ამით მთავარ მესიჯებსაც იღებ მარტივად და მერე თითოეულის reply-ებს.. |
Posted by: ShalvaSoft 4 Jun 2016, 00:39 | ||||||
Roofus
აგერ მაშინ ესე ნახე https://onedrive.live.com/redir?resid=DF0844C9F3BAEED9!52497&authkey=!AH1D_697A3yR4s0&v=3&ithint=photo%2cbmp Ruritania
ხო მარა ეხლა უყურე რა თემაა მანდ გავიჭედები ვიცი რა თუ სიტყვაზე მე გავაგზავნე და შესაბამისად პირველი მესიჯი მოხვდა Sent-ებში მერე თუ იმან დამიბრუნა Reply Sent-ებში ის კი რჩება მარა მე Inbox-შიც უნდა ვანხო შესაბამისად უნდა მოვძებნო ყველა მესიჯი არ აქვს მნიშვნელობნა არის თუ არა რეფლი ნერე მაგათი რეფლიები უნდა მოვძებნო და უნდა ჩავიდე ბოლოში და დავსორტო.... მერე ნაზად უკვე პირველზე უნდა ავიდე და ეგენი გამოვუიყარო აი მანდ ავირევი უკვე ზედმეტები გამომყვება ვიცი და მაგდენს ვეღარ დავფილტრავ...
არა ეგ შენ რასაც ამბობ მესენჯერია მაილი imap-ით ან pop3-ით წამოგიღია ნახავდი რომ მაგას მოყვება Message-Id და In-Reply-To ჰედერები ხო და ეგაა ზუსტად გადმოტანილი ჩემს ბაზაში მხოლოდ id მაქვს რიცხვებით და არა "ljkgkojmj" ასეთ ფორმატში დალშე ყველაფერი იგივეა თითქმის უბრალოდ ეგ პლიუსი აქვს რომ სორტირებებს ადვილად ვიზავ და ა.შ. მოკლედ მგონი გაგაგებინე რატომაც არ მაწყობს შენი ვარიანტი.. თან რომც ჩავდო ეგ 1 ტაბლიცა შენს ქუერიში ვერ ვხედავ სად ასელექტებ ბოლოებს 1 ტაბლიცის ჩამატება პრობლემა არ არის უბრალოდ ბოლოს ვერ დავასელექტებ... მიხვდი? |
Posted by: Ruritania 4 Jun 2016, 01:16 |
ShalvaSoft ცალკე ტესტ ტაბლიცები გააკეთე და ნახე როგორ მუშაობს რაც მოგწერე. და ინბოქსის პრობლემა შეგიძლია კიდევ ერთი ან ორი დამატებითი თარიღის შემოღებით მოაგვარო - updated_at და read_at ან უბრალოდ read (boolean 1/0). რამდენჯერაც reply მოვა, parent_id -თ ამოღებულ მესიჯს დააფდეითებ (updated_at) NOW() -თი read = 0 -ს მისცემ. მერე ინბოქსში გამოტანისას რომელსაც read = 0 ექნება, გააშავებ და სორტირებას კიდევ updated_at -ით გააკეთებ.. |
Posted by: ShalvaSoft 4 Jun 2016, 02:07 | ||||
Ruritania
აქ ეხლა parent_id-ში უნდა ჩაჯდეს მთავარი პარენტი ანუ ეხლა მე რაზეც IDreply = 0 მაქვს ხო??? იმიტომ რომ იგივე სტრუქტურა რომ ცლკე გამოვიტანო აზრს კარგავს... რაც შეეხება ზემოთ რომ მკითხე LEFT JOIN-ით არ გამოვაო
ნუ ისე არ მუშაობს როგორც უნდა იმუშაოს მაგრამ დახვეწა მოსულა მგონი არა??? |
Posted by: Ruritania 4 Jun 2016, 04:16 | ||||||
შენს მაგალითში გქონდა ასე: id IDreply 1 0 2 1 3 2 და მე ამაზე ვთქვი რანაირად იმუშავებს თქო. ასე გამოდის რომ თითოეულ მესიჯს შეიძლება ქონდეს 1 reply. ისე იმ მთავარ მესიჯს რასაც ვეძახით, thread -ად შეგიძლია შექმნა. იქნება ბევრი thread და თითოეულ thread-ს ექნება ბევრი მესიჯი. ამ მხრივ thread-ზე მეტი კონტროლი შეგეძლება გაიტანო და მესიჯს კიდევ ისეთ columnებს გაუწერ, რაც უშუალოდ მესიჯს ეხება და გჭირდება. მესიჯი რომ დაემატება thread-ს, updated_at -ს განაახლებ thread -ზე. |
Posted by: ShalvaSoft 4 Jun 2016, 05:17 | ||||
Ruritania
შეიძლება მართალიც ხარ ეხლა ვეღარ ვაზროვნებ უკვე დილის 5 საათია
ეგრეც არის მაგიტომაც ვიყენებ php while loop-ებს წინა გვერდზე მიდევს ფუნქციები პრობლემა იმაშია რომ სხვანაირად მაილ სერვერთან კონტაქტი გაჭირდება ტოესტ რამდნიმე დამატებითი ქუერი დაწერა მომიწევს იდეაში ისიც მუშაობს რაც მე მაქვს ეხლა გაკეთებული 1 პაწაწკუნტელა დეტალის გარდა ფოლდერების ამბავია წარმოიდგინე გავაგზავნე მე მესიჯი და ჩავარდა Sent-ებში ახლა დააბრუნა რეფლაი მაგ მესიჯზე ხო და აი აქ ვიჭედები შენს მაგალითშიც მაგაზე მექნება პრობლემა ვიცი ანუ მინდა რომ იგივე მესიჯი გამოჩნდეს როგორც Sent-ებში ისე inbox-ში და აი აქ ვიჭედები ჯერ ჯერობით აი ამ დონეზე ვარ.... pm ნახე კიდე მესიჯი კოდი გამოგიგზავნე როგორც ვშვები |
Posted by: Dixtosa 4 Jun 2016, 16:55 |
ShalvaSoft გააკეთე? როგორ? |
Posted by: ShalvaSoft 4 Jun 2016, 19:55 | ||
Dixtosa
php და mysql კომბინაცია რა... სხვა გზა ვერ მოვნახე იზვინი ზემოთ რაც დავდე კოდი ეგეც ბევრი იყო მეტს ვერ დავდებ აქ და თუ გინდა email client-ის აწყობა მოდი სკაიპში და მიმართულებას მოგცემ გადავღეჭე ეგ თემა.... |
Posted by: Dixtosa 4 Jun 2016, 20:11 |
ShalvaSoft ზემოთ ბევრი კოდია რომლებზე ამბობ? ბაზის სტრუქტურა შეცვალე? მოკლედ შეაჯამე რა მერე რო ვინმე მოვიდეს აქ ნახოს როგორ შეიძლება გაკეთება. პრინციპში მეც მაინტერესებს. |
Posted by: ShalvaSoft 4 Jun 2016, 22:23 | ||
Dixtosa
არა იგივეა უბრალოდ imap და smtp უნდა იხმარო წინიდან და უკნიდან და რა თქმა უნდა ბაზებს პირში უნდა მისცე Conclusion: ბაზის სტრუქტურა იგივე ბაზასთან საკონტაქტო ქუერები ზემოთ მიწერია უბრალოდ 1 მასივს დაამატებთ reply-ების გასაფილტრად სადაც id-ებს შეყრით და თუ IDreply დაემთხვა id-ს გაატარეთ და ეგაა... მართალია ის არაა რაც მინდოდა მაგრამ ალტერნატივა ვერ მოვძებნე უფრო დაწვრილებითი ინფოებისთვის PM... P.S. ისევ ვიმეორებ სამწუხაროდ სრულ კოდს სააშკარაოზე ვერ დავდებ რადგან ეგ კოდი გამოყენებულია პროექტში რომელიც დღე დღეზე გაეშვება თუ უბრალოდ ინტერესი გღრნით როგორ კეთდება ვიდეო გაკვეთილებს უყურეთ იუთუბზე თუ საქმისთვის გჭირდებათ მომწერეთ და დაგაკვაიანებთ... P.p.s. ისეთი გამოვიდა გავკარი Gmail-ს... ჯერ მარტო ის რად ღირს რომ რამდენიმე წამში მესიჯი უპრობლემოდ მიდის ასევე რეფლიები მოდის მესენჯერი სახით ყველა რეფლის შეიძლება ჰქონდეს ათაჩმენთი რომელიც ლამაზად გამოდის ფორმებში ფრევიუ და თუ შესაძლებელია იქვე რედაქტირებაც ასევე ჩახსნილი მაქვს რეპლი ბლოკი ანუ ქვემოთ რომ მოყვება ხოლმე ძველი მონაწერები მაგათი ნახვა ისედაც შეგიძლია მესიჯების სახით და ზედმეტია მოკლედ მაგარი რამეა რინ გავუშვებთ სატესტო რეჟიმში აუცილებლად დავწერ რომ თქვენც იხილოთ... |