hjkl Posted April 22, 2014 Report Share Posted April 22, 2014 (edited) Datubāzē glabājas ziņas, ko lietotāji sūta viens otram. Šeit: http://sqlfiddle.com/#!2/fad98d/1 Mērķis - sagrupēt visas ziņas pa sarakstēm un katrai sarakstei atgriezt vienu tabulas rindu. Piemēram, datubāzē pirmās 4 rindas ir sarakste starp lietotāju x un y. Līdz ar to pēc šāda query izpildes rezultātos būs 2 rindas - viena par saraksti starp x un y, otra par m un n. Katrā rindā jābūt informācijai par attiecīgo saraksti: abi dalībnieki(secība nav svarīga), pēdējā ziņa šajā sarakstē un nosūtīšanas laiks. Līdz ar to: 1. rinda - x, y, April, 22 2014 17:00:00+0000, message4 2. rinda - m, n, April, 22 2014 20:00:00+0000, message7 Izmantojam mysql. Kā to izpildīt? Edited April 22, 2014 by hjkl Quote Link to comment Share on other sites More sharing options...
codez Posted April 22, 2014 Report Share Posted April 22, 2014 (edited) Es jebkurā gadījumā taisītu arī sarakšu tabulu. Bet šijā gadījumā ļoti vienkārši būtu, ja izveidotu vēl vienu lauku (conversation_id), kurā glabā kombināciju no sūtītāja un saņēmēja tā, ka jaunākais no tiem ir pirmais, piem: a:b, a:c, b:c, x:y, m:n Un tad vienkārši taisa GROUP_BY conversation_id. idejiski: http://sqlfiddle.com/#!2/89e21/2 Edited April 22, 2014 by codez Quote Link to comment Share on other sites More sharing options...
hjkl Posted April 22, 2014 Author Report Share Posted April 22, 2014 Es jebkurā gadījumā taisītu arī sarakšu tabulu. Bet šijā gadījumā ļoti vienkārši būtu, ja izveidotu vēl vienu lauku (conversation_id), kurā glabā kombināciju no sūtītāja un saņēmēja tā, ka jaunākais no tiem ir pirmais, piem: a:b, a:c, b:c, x:y, m:n Un tad vienkārši taisa GROUP_BY conversation_id. Ko tu domāji ar sarakšu tabulu? Protams, ka tajā piemērā sender, reciever bija domāts sender_id, reciever_id, nevis uzreiz viņu vārdi. Quote Link to comment Share on other sites More sharing options...
Kavacky Posted April 23, 2014 Report Share Posted April 23, 2014 Ja pieiet praktiski un moderni, tad nevajag ne conversation tabulu, ne arī conversation_id ziņojumu tabulā. Jo ir jau unikāls key, pēc kura saraksti atlasīt: abu lietotāju id pāris. Quote Link to comment Share on other sites More sharing options...
codez Posted April 23, 2014 Report Share Posted April 23, 2014 Jo ir jau unikāls key, pēc kura saraksti atlasīt: abu lietotāju id pāris. Vai tad tas arī nav tas, ko es uzrakstīju atbildē? Ko tu domāji ar sarakšu tabulu? Sarakšu tabula ir tabula, kura raksturo saraksti starp lietotāju x un y. Piemēram pēdējās ziņas laiks, neizlasīto ziņu daudzums, utml. Tādā veidā, kad lietotājs ieiet savā message sadaļā, ir vajadzīgs tikai viens vienkāršs kverijs, lai atlasitu informāciju par sarakstēm ar citiem lietotājiem. Conversation tabulu var veidot ar dubulto ierakstu metodi, kad vienu saraksti raksturo 2 ieraksti. Viens raksturo x saraksti ar y, otrs y ar x. Tad ir teiksim lauki, userid1, userid2, last_message_time, unread_messages, utml. Un, ja gribi atlasīt visas x lietotāj sarakstes, tad SELECT * FROM conversations WHERE userid1 = xKad lietotājs x saņem ziņu, palielini unread_messages skaitu. Ja grib attēlot kopēja sarakšu lapā ari pēdēji ziņu, var izveidot lauku last_message_id un piejoinot. SELECT * FROM conversations c LEFT JOIN messages m ON c.last_meesage_id=m.id WHERE c.userd1=x Quote Link to comment Share on other sites More sharing options...
Kavacky Posted April 23, 2014 Report Share Posted April 23, 2014 Vai tad tas arī nav tas, ko es uzrakstīju atbildē? Ne gluži: ļoti vienkārši būtu, ja izveidotu vēl vienu lauku (conversation_id), kurā glabā kombināciju no sūtītāja un saņēmēja Bet nu pārējais būtībā ir pareizākais un ērtākais variants: Sarakšu tabula ir tabula, kura raksturo saraksti starp lietotāju x un y. Piemēram pēdējās ziņas laiks, neizlasīto ziņu daudzums, utml. Tādā veidā, kad lietotājs ieiet savā message sadaļā, ir vajadzīgs tikai viens vienkāršs kverijs, lai atlasitu informāciju par sarakstēm ar citiem lietotājiem. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.