рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдореВрд╣рдмрджреНрдз рд╕реАрд░рд┐рдпрд▓ рдкреЛрд╕реНрдЯ

рд╢реБрдн рджреЛрдкрд╣рд░, рд╣рдмреНрд░!

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛: рддрд╕реНрд╡реАрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рдлреЛрдЯреЛ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЧреИрд▓рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рднреА рдЪрдпрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдЦрдХ рдХреЗ рд▓рд┐рдП рдХрдИ "рдЯрд╛рдЗрдо рд╡рд┐рдВрдбреЛ" рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдирд┐рдореНрди рдкрджреЛрдВ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реИрдХрдбрд╝реЛрдВ рдлрд╝реЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдлреАрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреЛрд╕реНрдЯ рджреЗрдЦрдиреЗ рдкрд░, рдпрд╣ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкреНрд░рд┐рдп рд╣реЛрдЧрд╛ред

MySQL рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди



рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдЪрдпрди рдХреЗ рджреМрд░рд╛рди рдкрджреЛрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ: рдпрд╣ рдмрд╣реБрдд рд╣реА рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдХрд┐ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рд╕реНрдерд┐рд░ рд░рд╣реЗрдВ рдФрд░ рдХреБрдЫ рднреА рдХрд╣реАрдВ рд╕реЗ рднреА рдЧрд┐рд░ рди рдЬрд╛рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд▓рд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд "рд╕рдореВрд╣" рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╛рдзрд╛рди рдПрдХ рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЪрдХреНрд░ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реЗ, рдЖрдЗрдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ:

CREATE TABLE `feed`( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `tm` INT UNSIGNED NOT NULL COMMENT 'timestamp', `user_id` INT UNSIGNED NOT NULL COMMENT 'author id', `image` VARCHAR(255) NOT NULL COMMENT 'posted image filename', `group` INT UNSIGNED NULL DEFAULT NULL COMMENT 'post group', PRIMARY KEY(`id`), INDEX(`user_id`), INDEX(`tm`,`group`) ); 


`feed` рдкрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ tm рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдЦрдХ user_id рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ, рд╕реНрд╡рдпрдВ рдЪрд┐рддреНрд░, рдФрд░ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ group рдХреЙрд▓рдо рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЧреИрд▓рд░реА рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдореВрд╣ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, group=NULL ред

рд╡рд┐рдХрд▓реНрдк рдЧрд▓рдд рд╣реИ


рдкрд╣рд▓реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ: рд╣рдо рд╕рдмрд╕реЗ рдирдП рдкреЛрд╕реНрдЯ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдПрдХ рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рднреА group= id-- рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕рдореВрд╣ рдХрд╛ рд╣реЛрдЧрд╛ред рдирд╣реАрдВ, рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ :)

рд╕рдореВрд╣



рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдкрджреЛрдВ рдХреА рдЕрд╕реНрдерд╛рдпреА рдирд┐рдХрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирджрдВрдб рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 SET @granularity:=60*60; 


рдЗрд╕рд▓рд┐рдП, рдПрдХ рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рд╕рднреА рдкреЛрд╕реНрдЯ рдПрдХ рдЧреИрд▓рд░реА рдореЗрдВ рд╕рдореВрд╣реАрдХреГрдд рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдЕрдЧрд▓рд╛, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рдмрдирд╛рддреЗ рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП "рдиреАрдВрд╡" рдмрдирдиреЗ рджреЗрдВ:

 SELECT `g`.`id` AS `group` FROM `feed` `g`; 


рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ "рдЖрдзрд╛рд░" (рд╕рдордп рдЕрдВрддрд░ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рд╣реИ) рд╕реЗ рдкреНрд░рддрд┐ рдШрдВрдЯрд╛ рддреНрд░рд┐рдЬреНрдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА:

 SELECT `g`.`id` AS `group`, `f`.* FROM `feed` `g` CROSS JOIN `feed` `f` ON (`f`.`user_id` = `g`.`user_id` AND `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm` ) 


рдЗрд╕рд▓рд┐рдП, рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВред рдЪрдпрди рдорд╛рдирджрдВрдб: рд╣рдо "рдЖрдзрд╛рд░" рдПрдХ рдкрдж рдХреЗ рд░реВрдк рдореЗрдВ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐ рдШрдВрдЯрд╛ рддреНрд░рд┐рдЬреНрдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред
рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде MySQL рдХреЛ рддрдирд╛рд╡ рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдХрд╕реМрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm` : рддреЛ рд╡реНрдпрд╛рдкрдХ рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm` рд╣реЛрдЧрд╛ :

 SELECT MAX(`g`.`id`) AS `group`, `f`.* FROM `feed` `g` CROSS JOIN `feed` `f` ON (`f`.`user_id` = `g`.`user_id` AND `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm` ) GROUP BY `f`.`id` 


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЪреБрдирд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рдпрд╛ред

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреЗрдк рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрдм `group` DESC рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░, рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ MAX() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯреЗрдк рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдирд╡реАрдирддрдо "рдЧреНрд░реБрдк" (рдирд╡реАрдирддрдо рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд) рдмрд╣реБрдд рдКрдкрд░ рддрдХ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдлрд┐рд░ рд╣рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕рдореВрд╣ рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рддрддреНрд╡ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ MIN() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рдЖрдзрд╛рд░ рддрдм рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рдкреЛрд╕реНрдЯ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдореВрд╣ рдХреЛ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝реЛрдЯреЛ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 SELECT MIN(`g`.`id`) AS `group`, `f`.* FROM `feed` `g` CROSS JOIN `feed` `f` ON (`f`.`user_id` = `g`.`user_id` AND `f`.`tm` BETWEEN `g`.`tm` AND `g`.`tm`+@granularity ) GROUP BY `f`.`id` 


рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: `group` рдХреЙрд▓рдо рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВред MySQL рдЙрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдПрдХ UPDATE рдХреНрд╡реЗрд░реА рдореЗрдВ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдЪрдпрди рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 CREATE TEMPORARY TABLE `_feedg` SELECT MAX(`g`.`id`) AS `group`, `f`.`id` FROM `feed` `g` CROSS JOIN `feed` `f` ON (`f`.`user_id` = `g`.`user_id` AND `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm` ) WHERE `f`.`group` IS NULL OR `f`.`tm` >= (UNIX_TIMESTAMP()-2*@granularity) GROUP BY `f`.`id`; 


рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ WHERE рдзреНрдпрд╛рди рджреЗрдВ: рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд░реАрдЧреНрд░реБрдкрд┐рдВрдЧ рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдмреАрдЪ, рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЕрдм, рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдореВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 UPDATE `feed` `f` CROSS JOIN `_feedg` `g` USING(`id`) SET `f`.`group` = `g`.`group`; 


рдкреНрд░рддреНрдпреЗрдХ рд╕рдореНрдорд┐рд▓рди рдХреЗ рдмрд╛рдж рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдХреНрд░рд╛рдЙрди рджреНрд╡рд╛рд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдХреБрдЫ рдХрд╛рдо рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

UPD: рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд▓реНрдХрд┐рдЬ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдкрдврд╝реЗ рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ JOIN рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЙрдкрдХреБрдВрдЬреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ CREATE TEMPORARY TABLE рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ UPDATE рдХреНрд╡реЗрд░реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 UPDATE `feed` `f` CROSS JOIN ( SELECT MAX(`g`.`id`) AS `group`, `f`.`id` FROM `feed` `g` CROSS JOIN `feed` `f` ON (`f`.`user_id` = `g`.`user_id` AND `f`.`tm` BETWEEN `g`.`tm`-@granularity AND `g`.`tm`) WHERE `f`.`group` IS NULL OR `f`.`tm` >= (UNIX_TIMESTAMP()-2*@granularity) GROUP BY `f`.`id` ) `g` USING(`id`) SET `f`.`group` = `g`.`group`; 


рдирдореВрдирд╛



рдЕрдм, рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдЪрдпрди рдХрд░реЗрдВ?

рдпрджрд┐ `group` рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП `group` , рддреЛ

 SELECT * FROM `feed` ORDER BY `group` DESC, `tm` DESC; 


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрд░реЛрдз рдореБрдХреБрдЯ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП group=NULL , рдХреБрдЫ рдЖрдЙрдЯрдкреБрдЯ рддрд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реЗрдВрдбрд░рд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЪрдпрди рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 SELECT * FROM `feed` ORDER BY `group` IS NULL, `group` DESC, `tm` DESC; 


рд╕рдВрджрд░реНрдн



рдореЗрд░рд╛ рдкреНрд░рд╢реНрди рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рд╣реИ: рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлреАрдб рдореЗрдВ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдирд╛ ред рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдЯрд╛рдЗрдо рд╡рд┐рдВрдбреЛ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдУрд░реЗрдХрд▓ рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

SQLfiddle, рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЗрд▓рдиреЗ: SQLfiddle

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдорджрджрдЧрд╛рд░ рд░рд╣рд╛ рд╣реВрдБред

Source: https://habr.com/ru/post/In150063/


All Articles