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
სხვა შემთხვევაში აქ მოდის იმ მესიჯის იდ რომლის რეფლაიც არის

მაგალითისთვის
CODE

id,     name,               message,       IDreply                    datereply                             datereceived
1        ნინო                  bla           0                      2016-06-01 21:39:44             2016-06-01 21:35:44
2        ნინო                  bli blu       1                      2016-06-01 22:00:00             2016-06-01 21:39:44
3        თორნიკე               kitri         2                      2016-06-01 22:00:00             2016-06-01 22:00:00
4        ლამარა                racxa         0                      2016-06-01 21:47:35             2016-06-01 21:39:44
5        ლაშა                  rucxa         0                      0000-00-00 00:00:00             2016-06-01 22:00:00
6        ჟორა                  traki         4                      0000-00-00 00:00:00             2016-06-01 21:47:35


და ა.შ.

ეხლა მე მინდა რომ დავასელექტო ყველა რომელსაც აქვს IDreply 0
და ორდერინგი გავუკეთო datereply-ების მიხედვით

ანუ
რომ გავაკეთებ
SQL
SELECT * FROM msg WHERE IDreply = 0 ORDER BY datereceived


მერე მინდა რომ გადაუაროს რეპლაიებს და დაამთხვიოს id IDreply-ებს
და მაგის მიხედვით გააკეთოს 0-იანი IDreply-ების ორდერინგი

მგონი სწორად ჩამოვაყალიბე ამოცანა მაგრამ გადაწყვეტა ვერ მოვუძებნე

სავარაუდოდ LEFT JOIN დაჭირდება ჩემი აზრით მაგრამ
ყველას რომ გადაუაროს სათითაოდ ხომ არ ჩამოვწერ ჯოინებს???


ხო და მაგიტომ მინდა რაღაც ლუპისნაირი ოღონდ ქუერიში რომ თავისით მიხვდეს სანამდე აგრძელოს ეგ

გთხოვთ რა

სასწრაფოდ მჭირდება შემოშველება რა
1 კვირაა ამაზე ვფიქრობ და ერთადერთი გადაწყვეტა რაც მოვუფიქრე php-თი სათითაოდ გადალუპვაა და სათითაო რეპლიების ცალ ცალკე ქუერით ამოღებაა
ეს კი დიდ დროსა და რესურს მოითხოვს

მე კიდე მინდა პრასტოი ლისტიო გამოვიტანო და მაგდენ ხანს კლიენტი არ დაიცდის

ამიტომაც გთხოვთ დახმარებას
ვფიქრობ mysql ამას უკეთესად გაუკლავდება...

Posted by: Dixtosa 2 Jun 2016, 20:00
QUOTE
მგონი სწორად ჩამოვაყალიბე

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-ით
მაგრამ არაა ეგ კაი საქციელი

პირველ რიგში ვიღებ ყველა მესიჯს რომელიც ეკუთვნის კონკრეტულ უზერს

CODE

public function getmails($folderID, $folderName, $user){
           $this->db->select("*, '$folderName' AS foldername");
           $this->db->from("email");
           $this->db->where("folder", $folderID);
           $this->db->where("user", $user);
           $this->db->order_by("received", "desc");
           $query = $this->db->get();
           $data =  $query->result();
           $sort = [];
           foreach ($data as $ksort => $vsort){
               $lastmail = $this->getLastMail($vsort->id);
               $newdata = !empty($lastmail) ? $lastmail : $vsort;
               $newdata->received = strtotime($newdata->received);
               $sort[$ksort] = $newdata;
           }
           usort($sort, function($a, $b) {
               return $b->received - $a->received;
           });
           $info = [];
           foreach ($sort as $mail){
               $info[] = $mail->IDreply != 0 ? $this->getFirstMail($mail->id) : $mail;
           }
           return $info;
       }


მიღებული შედეგის მიხედვით ვიღებ ბოლოს მოსულ მესიჯებს

CODE

public function getLastMail($mailid){
           $mail = $this->getrepliedmails($mailid);
           while(!empty($mail)){
               $mail = $this->getrepliedmails($mail[0]->id);
           }
           return $mail;            
       }


და ვაკეთებ მაგათი მოსვლის დროების მიხედვით ორდერინგ კლებადობაზე პირველ ფუნქციაში არსებული usort-ით,,,,

მერე უკვე დავუყვები და ვპოულობ პირველ მესიჯებს
CODE

public function getFirstMail($mailid){
           $mail = $this->get_mail($mailid);
           do{
               $mail = $this->get_mail($mail->IDreply);
           }while($mail->IDreply > 0);
           return $mail;
       }


და აი ამას ვაბრუნებ უკვე

ესაა ზუსტი სტრუქტურა ბაზის
user posted image

თუ რამეს ვერ გაუგებთ
რა ქუერი იკვრება მაგ [h[-ებით
შემიძლია გავშალო...
მაგრამ იდეაში ყველაფერი გასაგები უნდა იყოს...

Posted by: Lilith 2 Jun 2016, 22:09
ShalvaSoft
თავშივე რომ გაგეთვალისწინებინა უფრო მარტივად გააკეთებდი ამ ყველაფერს. ერთი სვეტი რომ დაუმატო მაგ ცხრილს და ჩაწერო ძირითადი ჩანაწერის id მაგით ეშველება ამ ყველაფერს და შენც არ დაგჭირდება ბაზაში ძებნა.

Posted by: ShalvaSoft 3 Jun 2016, 00:09
Lilith
QUOTE
თავშივე რომ გაგეთვალისწინებინა უფრო მარტივად გააკეთებდი ამ ყველაფერს. ერთი სვეტი რომ დაუმატო მაგ ცხრილს და ჩაწერო ძირითადი ჩანაწერის id მაგით ეშველება ამ ყველაფერს და შენც არ დაგჭირდება ბაზაში ძებნა.

ეგ არ მაწყობს რადგან პირველიუ მესიჯი შეიძლება წაიშალოს
და დავრჩები ჰაერში მაგ შემთხვევაში...

Posted by: Dixtosa 3 Jun 2016, 00:22
ShalvaSoft
დამალე არ წაშალო :/. რაც შენ გინდა არაა შესაძლებელი რედუნდანსის შემოღების გარეშე.

Posted by: ShalvaSoft 3 Jun 2016, 00:44
Dixtosa
QUOTE
დამალე არ წაშალო :/. რაც შენ გინდა არაა შესაძლებელი რედუნდანსის შემოღების გარეშე.

ძააბ დიდი ბოდიში
ტერმინებში ვერ ვერკვევი

შეგიძლია ამიხსნა რედუბდაბსი რა არის???

და რომ არ წავშალო ეგ არ მაწყობს რადგან
კლიენტი თუ შლის მაგ მაილს
უნდა წაიშალოს როგორც მაილ სერვერზე
ასევე ბაზიდანაც
თან კონკრეტული სპეისი გვაქვს მიცემუი კონკრეტულ აქაუნთზე და მოკლედ კლიენტმა უნდა ნახოს რამდენი დარჩა და ა.შ.

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
QUOTE
ზედმეტი კოდი არის რედუნდანსი

გასაგებია
მადლობა ინფოსთვის

მარა ჩემს კოდში რედუნდასი არაა და რავი აბა...

როგორ დავიჯერო რომ სქლს იმის გაკეთება არ შეუძლია რაც მე 4 ფუნქციაში გავშალე???

Posted by: Roofus 3 Jun 2016, 01:34
ShalvaSoft
QUOTE
როგორ დავიჯერო რომ სქლს იმის გაკეთება არ შეუძლია რაც მე 4 ფუნქციაში გავშალე???

აი ეს არის რედუნდანსი...
ანუ 4 ფუნქციაში რომ ატრიალებ ერთ ინფოს...
ხო შეიძლება რომ პირდაპირ ის ინფო წამოიღო რაც გჭირდება...
მე ზუსტად ვერ გავიგე რა გინდა user.gif ამიტომ ვერაფერს გწერ biggrin.gif
მივხვდი რომ მესიჯების გაფილტვრა გინდა მაგრამ რომელის ვერ გავიგე... biggrin.gif
ისე შეეცადე ბაზის წყობა შეცვალო ან ბოლო ბოლო 2 ტეიბლად გატეხო...
ან კიდე რამე მარკერები შემოიღო + 2 ტეიბლად გატეხო...

რავიცი რამე ცვლილება ბაზის ისე რომ შეძლო მარტივად წამოღება იმ ინფოსი რაც გჭირდება smile.gif

Posted by: ShalvaSoft 3 Jun 2016, 01:39
Roofus
QUOTE
რავიცი რამე ცვლილება ბაზის ისე რომ შეძლო მარტივად წამოღება იმ ინფოსი რაც გჭირდება

არა კაცო ბაზის სტრუქტურა სწორია
მაგაზე უკეთესი წყობა შეუძლებელია

QUOTE
ხო შეიძლება რომ პირდაპირ ის ინფო წამოიღო რაც გჭირდება...

სორტირება მჭირდება რას ვერ მიხვდი???

უნდა ამოვიღო პირველი მესიჯები
ოღონდ ორდერინგი უნდა მოხდეს ბოლოს მიღებული მესიჯების დეითებით...

Posted by: Roofus 3 Jun 2016, 01:44
ShalvaSoft
და შენც AND გამოიყენე ORDER თან ერთად და მარტო ერთი ROW წამოიღე... boli.gif არა?


WHERE replyID = 0 ORDER by id AND date LIMIT 1

Posted by: ShalvaSoft 3 Jun 2016, 10:28
Roofus
QUOTE
WHERE replyID = 0 ORDER by id AND date LIMIT 1

ხო ეგ მარტო 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
QUOTE
როგორც მივხვდი, შენს მაგალითში პირველ მესიჯს (bla) არ აქვს reply. მეორე კიდევ პირველის reply არის (bli blu არის bla-ს reply).

კი ეგრეა ნამდვილად

QUOTE
გინდა რომ ერთმანეთთან დააკავშირო ესენი ჯოინით და 2 ორდერ გადაატარო - პირველი datereply-ზე და მეორე datereceived-ზე?

ხო ხო

ანუ რეალურად მე მჭირდება პირველი მესიჯების ამოღება
ოღონდ ორდერიუნგი უნდა იყოს ბოლო მესიჯების მოსვლის დროზე


Posted by: Ruritania 3 Jun 2016, 14:29
თითო მესიჯს მარტო 1 reply ექნება ყოველთვის?
-----
ეხლა შევხედე ისევ მაგალითს და nested reply-ები გაქვს, ვნახე. ანუ 0 რომელსაც აქვს, ის არის parent მესიჯი და დანარჩენები მოყვებიან მერე.
* * *
ასეთ ვარიანტს გავაკეთებდი:

გაქვს 2 table. ერთი messages და მეორე replies. replies არის უბრალო pivot table-ი:

CODE

CREATE TABLE `messages` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(45) DEFAULT NULL,
 `message` varchar(45) DEFAULT NULL,
 `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;


CODE

CREATE TABLE `replies` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent_id` int(11) DEFAULT NULL,
 `message_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


და მერე

CODE

SELECT
   /* m2 ამ შემთხვევაში არის იგივე მესიჯების ცხრილი, ოღონდ replies სახით. ხოლო m არის პირველი მესიჯი, ანუ რისი reply-ებიც არის დანარჩენი. */
   m.id AS parentId,
   m.name AS parentName,
   m.message AS parentMessage,

   m2.id AS replyId,
   m2.name AS replyName,
   m2.message AS replyMessage
FROM
   testing.messages AS m
       JOIN
   replies AS r ON m.id = r.parent_id
       JOIN
   messages AS m2 ON r.message_id = m2.id
   
   /* აქ ჩაუწერ თუ კონკრეტული მესიჯის reply-ები გინდა. */
   where m.id = 4
   
   order by m2.created_at desc;

Posted by: Roofus 3 Jun 2016, 16:18
მეც ეგ უთხარი, მარკერები დაამატე მეთქი ბაზაში... მარა არაო... არ მინდა ბაზის შეცვლაო...

Posted by: Ruritania 3 Jun 2016, 16:31
Roofus
მემგონი არც გამოვა არანაირად იმიტომ რომ საბოლოო ჯამში 1 სია უნდა გამოვიდეს და ისე ვერ დაჯგუფდება, ან ძალიან ჩაიხლართება.
აი დაახლოებით ასეთ შემთხვევაში:

CODE

id     IDreply
1      0
2      1
3      2
4      3
5      0
6      4

Posted by: stinky 3 Jun 2016, 17:37
user posted image

ასეთი რაღაც გინდა?

Posted by: ShalvaSoft 3 Jun 2016, 20:12
stinky
QUOTE
ასეთი რაღაც გინდა?

მეილ კლიენტს ვაწყობ მესენჯერს კი არა შე კაცო...

Ruritania
QUOTE
თითო მესიჯს მარტო 1 reply ექნება ყოველთვის?
-----
ეხლა შევხედე ისევ მაგალითს და nested reply-ები გაქვს, ვნახე. ანუ 0 რომელსაც აქვს, ის არის parent მესიჯი და დანარჩენები მოყვებიან მერე.

ხო ეგრეა
და კაკრას ეგ 0-იანებიანები უნდა ამოვიღო
ოღონდ ბოლოს მოსული ნესთიდების მოსვლის დროით უნდა დაისორტოს...

მაგის იდეა ისაა რომ ბოლოს თუ მოვიდა რეპლი მესიჯზე რომლის მერე კიდეა მოსული 50
ეს მესიჯი პირველ ადგილზე უნდა ამიწიოს...

ანუ სტანდარტული მეილ კლიენტის ვარიანტია....

Posted by: Ruritania 3 Jun 2016, 20:53
ShalvaSoft
ხოდა იმ pivot table-ით გააკეთებ თავისუფლად..

მთავარი მესიჯები თუ გინდა რომ წამოიღო (ანუ რომელიც არ არის reply), ასეთ რაღაცას გააკეთებ:

CODE

SELECT DISTINCT
   messages.id, messages.name, messages.message
FROM
   messages
WHERE
   messages.id NOT IN (SELECT
           messages.id
       FROM
           messages
               JOIN
           replies ON messages.id = replies.message_id)
   order by messages.created_at desc;


და შემდეგ უკვე რომელიმე მესიჯზე რომ შევა მომხმარებელი (და შესაბამისად id რომ გექნება უკვე რაც გახსნა) იმ ზემოთა query-ში ჩასვამ რაც მოგწერე. და იქედან parentId, parentName, parentMessage შეგიძლია ამოიღო და მარტო reply-ების ლისტი გექნება.

თუ ასე იზამ, მაშინ ზუსტად ერთი და იგივენაირი ობჯექტი იქნება თითოეული მესიჯი, არ აქვს მნიშვნელობა parent-ია თუ reply და შესაბამისად 1 კლასი შეგიძლია გქონდეს მარტო..

Posted by: ShalvaSoft 3 Jun 2016, 22:22
Ruritania
QUOTE
SELECT DISTINCT
   messages.id, messages.name, messages.message
FROM
   messages
WHERE
   messages.id NOT IN (SELECT
           messages.id
       FROM
           messages
               JOIN
           replies ON messages.id = replies.message_id)
   order by messages.created_at desc;


ამას არსებულ ტაბლიცათითა ვიზავ LEFT JOIN-ით მარა
იმ ბოლო მესიჯებისა და პირველი მესიჯების ამბავია...
* * *
პროსტო ტაბლიცის გაშლა რატო არ მაწყობს იცი???
მამდ ფოლდერის მიხედვით ვფილტრავ და შეიძლება მარტო 1 წერილი იყოს და შეიძლება 50 რეფლი ქონდეს და
ცალ ცალკე ტაბლიცაში ვერ გავში რა...

სურათი რომ დავდე სტრუქტურის
მაგას შეხედე და მიხვდები

Posted by: Roofus 3 Jun 2016, 22:55
ShalvaSoft
QUOTE
სურათი რომ დავდე სტრუქტურის
მაგას შეხედე და მიხვდები

სურათი გიდევს ცუდი ხარისხის ძალიან. ტექსტი არ იკითხება boli.gif

Posted by: Ruritania 3 Jun 2016, 23:25
QUOTE (ShalvaSoft @ 3 Jun 2016, 22:22 )
Ruritania
QUOTE
SELECT DISTINCT
   messages.id, messages.name, messages.message
FROM
   messages
WHERE
   messages.id NOT IN (SELECT
           messages.id
       FROM
           messages
               JOIN
           replies ON messages.id = replies.message_id)
   order by messages.created_at desc;


ამას არსებულ ტაბლიცათითა ვიზავ LEFT JOIN-ით მარა
იმ ბოლო მესიჯებისა და პირველი მესიჯების ამბავია...
* * *
პროსტო ტაბლიცის გაშლა რატო არ მაწყობს იცი???
მამდ ფოლდერის მიხედვით ვფილტრავ და შეიძლება მარტო 1 წერილი იყოს და შეიძლება 50 რეფლი ქონდეს და
ცალ ცალკე ტაბლიცაში ვერ გავში რა...

სურათი რომ დავდე სტრუქტურის
მაგას შეხედე და მიხვდები

LEFT JOIN-ით არსებულ ტაბლიცაზე როგორ გამოვა? ერთი მეორის reply გაქვს იქ. და აქ კიდევ 1 parent_id არის და სხვები მიბმულია მასზე და ორდერს აკეთებს თარიღის მიხედვით, (როგორც უნდა იყოს მაილი ზოგადად)..

რაც მოგწერე, ამით მთავარ მესიჯებსაც იღებ მარტივად და მერე თითოეულის reply-ებს..

Posted by: ShalvaSoft 4 Jun 2016, 00:39
Roofus
QUOTE
სურათი გიდევს ცუდი ხარისხის ძალიან. ტექსტი არ იკითხება

აგერ მაშინ ესე ნახე

https://onedrive.live.com/redir?resid=DF0844C9F3BAEED9!52497&authkey=!AH1D_697A3yR4s0&v=3&ithint=photo%2cbmp

Ruritania
QUOTE
რაც მოგწერე, ამით მთავარ მესიჯებსაც იღებ მარტივად და მერე თითოეულის reply-ებს..

ხო მარა ეხლა უყურე რა თემაა
მანდ გავიჭედები ვიცი რა

თუ სიტყვაზე მე გავაგზავნე
და შესაბამისად
პირველი მესიჯი მოხვდა Sent-ებში
მერე თუ იმან დამიბრუნა Reply
Sent-ებში ის კი რჩება მარა
მე Inbox-შიც უნდა ვანხო

შესაბამისად უნდა მოვძებნო ყველა მესიჯი
არ აქვს მნიშვნელობნა არის თუ არა რეფლი
ნერე მაგათი რეფლიები უნდა მოვძებნო
და უნდა ჩავიდე ბოლოში და დავსორტო....
მერე ნაზად უკვე პირველზე უნდა ავიდე და ეგენი გამოვუიყარო

აი მანდ ავირევი უკვე
ზედმეტები გამომყვება ვიცი და მაგდენს ვეღარ დავფილტრავ...

QUOTE
LEFT JOIN-ით არსებულ ტაბლიცაზე როგორ გამოვა? ერთი მეორის reply გაქვს იქ. და აქ კიდევ 1 parent_id არის და სხვები მიბმულია მასზე და ორდერს აკეთებს თარიღის მიხედვით, (როგორც უნდა იყოს მაილი ზოგადად)..

არა ეგ შენ რასაც ამბობ მესენჯერია

მაილი 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
QUOTE
CREATE TABLE `replies` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent_id` int(11) DEFAULT NULL,
 `message_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


აქ ეხლა parent_id-ში უნდა ჩაჯდეს მთავარი პარენტი ანუ ეხლა მე რაზეც IDreply = 0 მაქვს ხო???
იმიტომ რომ იგივე სტრუქტურა რომ ცლკე გამოვიტანო აზრს კარგავს...

რაც შეეხება ზემოთ რომ მკითხე LEFT JOIN-ით არ გამოვაო

SQL
SELECT m.id, m.`IDreply` FROM `email` AS m
LEFT JOIN `email` AS m2 ON m2.`IDreply` = m.id
WHERE m2.`IDreply` != 0 AND m.`user` = 45 AND m.`folder` = 1


ნუ ისე არ მუშაობს როგორც უნდა იმუშაოს მაგრამ დახვეწა მოსულა მგონი არა???

Posted by: Ruritania 4 Jun 2016, 04:16
QUOTE (ShalvaSoft @ 4 Jun 2016, 02:07 )
Ruritania
QUOTE
CREATE TABLE `replies` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent_id` int(11) DEFAULT NULL,
 `message_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


აქ ეხლა parent_id-ში უნდა ჩაჯდეს მთავარი პარენტი ანუ ეხლა მე რაზეც IDreply = 0 მაქვს ხო???
იმიტომ რომ იგივე სტრუქტურა რომ ცლკე გამოვიტანო აზრს კარგავს...

რაც შეეხება ზემოთ რომ მკითხე LEFT JOIN-ით არ გამოვაო

SQL
SELECT m.id, m.`IDreply` FROM `email` AS m
LEFT JOIN `email` AS m2 ON m2.`IDreply` = m.id
WHERE m2.`IDreply` != 0 AND m.`user` = 45 AND m.`folder` = 1


ნუ ისე არ მუშაობს როგორც უნდა იმუშაოს მაგრამ დახვეწა მოსულა მგონი არა???

შენს მაგალითში გქონდა ასე:

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
QUOTE
ისე იმ მთავარ მესიჯს რასაც ვეძახით, thread -ად შეგიძლია შექმნა. იქნება ბევრი thread და თითოეულ thread-ს ექნება ბევრი მესიჯი. ამ მხრივ thread-ზე მეტი კონტროლი შეგეძლება გაიტანო და მესიჯს კიდევ ისეთ columnებს გაუწერ, რაც უშუალოდ მესიჯს ეხება და გჭირდება. მესიჯი რომ დაემატება thread-ს, updated_at -ს განაახლებ thread -ზე.

შეიძლება მართალიც ხარ
ეხლა ვეღარ ვაზროვნებ უკვე
დილის 5 საათია

QUOTE
და მე ამაზე ვთქვი რანაირად იმუშავებს თქო. ასე გამოდის რომ თითოეულ მესიჯს შეიძლება ქონდეს 1 reply.

ეგრეც არის
მაგიტომაც ვიყენებ 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
QUOTE
გააკეთე? როგორ?

php და mysql კომბინაცია რა...

სხვა გზა ვერ მოვნახე

იზვინი ზემოთ რაც დავდე კოდი ეგეც ბევრი იყო მეტს ვერ დავდებ აქ
და თუ გინდა email client-ის აწყობა მოდი სკაიპში და მიმართულებას მოგცემ

გადავღეჭე ეგ თემა....


Posted by: Dixtosa 4 Jun 2016, 20:11
ShalvaSoft
ზემოთ ბევრი კოდია რომლებზე ამბობ?


ბაზის სტრუქტურა შეცვალე?


მოკლედ შეაჯამე რა მერე რო ვინმე მოვიდეს აქ ნახოს როგორ შეიძლება გაკეთება. პრინციპში მეც მაინტერესებს.

Posted by: ShalvaSoft 4 Jun 2016, 22:23
Dixtosa
QUOTE
ბაზის სტრუქტურა შეცვალე?

არა იგივეა
უბრალოდ imap და smtp უნდა იხმარო წინიდან და უკნიდან

და რა თქმა უნდა ბაზებს პირში უნდა მისცე biggrin.gif

Conclusion:
ბაზის სტრუქტურა იგივე

ბაზასთან საკონტაქტო ქუერები ზემოთ მიწერია
უბრალოდ 1 მასივს დაამატებთ reply-ების გასაფილტრად სადაც id-ებს შეყრით და თუ IDreply დაემთხვა id-ს გაატარეთ და ეგაა...

მართალია ის არაა რაც მინდოდა მაგრამ
ალტერნატივა ვერ მოვძებნე

უფრო დაწვრილებითი ინფოებისთვის PM...

P.S. ისევ ვიმეორებ
სამწუხაროდ სრულ კოდს სააშკარაოზე ვერ დავდებ
რადგან ეგ კოდი გამოყენებულია პროექტში რომელიც დღე დღეზე გაეშვება

თუ უბრალოდ ინტერესი გღრნით როგორ კეთდება ვიდეო გაკვეთილებს უყურეთ იუთუბზე
თუ საქმისთვის გჭირდებათ
მომწერეთ და დაგაკვაიანებთ...

P.p.s. ისეთი გამოვიდა გავკარი Gmail-ს... biggrin.gif

ჯერ მარტო ის რად ღირს რომ რამდენიმე წამში მესიჯი უპრობლემოდ მიდის
ასევე რეფლიები მოდის მესენჯერი სახით
ყველა რეფლის შეიძლება ჰქონდეს ათაჩმენთი
რომელიც ლამაზად გამოდის ფორმებში ფრევიუ და თუ შესაძლებელია იქვე რედაქტირებაც

ასევე
ჩახსნილი მაქვს რეპლი ბლოკი
ანუ ქვემოთ რომ მოყვება ხოლმე ძველი მონაწერები

მაგათი ნახვა ისედაც შეგიძლია მესიჯების სახით და ზედმეტია

მოკლედ მაგარი რამეა
რინ გავუშვებთ სატესტო რეჟიმში
აუცილებლად დავწერ რომ თქვენც იხილოთ...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)