遊び場アウトです:
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`)
);
私たちは一緒のグループに一時的に接近している投稿をしたいと思います。
まず、所望の粒度宣言:
SELECT `g`.`id` AS `group`
FROM `feed` `g`;
:各行は行IDと一致するグループIDを有するグループを(それはまた、タイムスタンプであってもよい)を形成
SET @granularity:=60*60;
:時間的近接度に閾値を
各グループは、同じユーザから発信行が含まれている以前のグループ、前者よりも掲示された:
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`[email protected] AND `g`.`tm`
)
各行は複数のグループに属します。各行について、我々は最も「幅広い」グループを選択:それは最大のROWID
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`[email protected] AND `g`.`tm`
)
GROUP BY `f`.`id`
は最近更新されたグループは、常にトップ(ソートgroup
DESCたか)にジャンプしています。今
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`[email protected]
)
GROUP BY `f`.`id`
、私たちはテーブルのを更新するつもりだ:あなたはグループが永続的でたい場合 しかし、MIN
代わりMAX
の使用、(たとえば、アイテムを別のグループから移動しないようにします) group
カラム。 最初に、MySQLはあなたが読んでいる同じテーブルを更新できません。一時的なテーブルが必要です。 第二:我々は唯一のgroup
列NULLである、または行以降のUNIX_TIMESTAMP()-2*@threshold
よりも掲示行更新:
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`[email protected] AND `g`.`tm`
)
WHERE `f`.`group` IS NULL
OR `f`.`tm` >= (UNIX_TIMESTAMP()-2*@granularity)
GROUP BY `f`.`id`;
をそしてgroup
コラム更新:
UPDATE `feed` `f` CROSS JOIN `_feedg` `g` USING(`id`)
SET `f`.`group` = `g`.`group`;
ここSQLFiddleです:http://sqlfiddle.com/#!2/be9ce/15
任意のカラムは、タイムスタンプを含むことが可能です。しかし、その後、どのように選択して、「近くに」行を張り合わせるのですか? – kolypto
更新されました。このような問題を解決しようとすると、コンピュータとデータベースについて忘れてしまいます。論理的に考えてみましょう。複数のアイテムをどのように「関連付ける」ことができますか? –
しかし、私はあなたの提案を使用する場合は、[私はこの技術を使用する必要があります(http://stackoverflow.com/questions/10542647/grouping-serial-posts) -in-a-user-feed)を使用してフィードを表示する – kolypto