2017-09-24 30 views
0

我有一张桌子,我管理我参加的比赛,目前它有4列。长期跟踪mysql的变化 - 形成线图等

ID 
Name 
Tag 
Rating 

有效,我想追踪标签,只要可能的变化(和它改变的日期),以提供我的用户他们在竞争中发挥的折线图。

我试过四处寻找一种做法,但大多数我可以用我有限的知识找到的方法是只保存最后一次更改,或者在做出更改时保存整个表的方法。在我的情况下,更改是针对个人用户(行)进行的,因此需要单独进行跟踪。

任何帮助将不胜感激。

编辑:

样品

id | name  | tag | rating 
------------------------- 
1 | Khar  | 5  | 800 
2 | SantaCruz | 3  | 850 
3 | Sion  | 2  | 900 
4 | VT   | 1  | 758 
5 | newFort  | 4  | 535 
6 | Bandra  | 6  | 483 
7 | Worli  | 10 | 888 
8 | Sanpada  | 11 | 999 
9 | Joe   | 9  | 779 
10 | Sally  | 15 | 888 
11 | Elphiston | 17 | 525 
12 | Currey Road | 31 | 879 

标签有效地是,我想在一个较长期的跟踪排名。

当谈到理想的结果时,我不确定什么是可能的。实际上,我希望能够为每个人创建一个线图,(y轴:标签,x轴:日期),所以另一个表跟踪所有的变化和他们的日期,我想这将是理想的。

+0

编辑您的问题,并提供样本数据和期望的结果。添加了 –

+0

。我希望这已经足够清晰 – copyleft

+0

您的数据不完整。数据中没有日期列。而MySQL不会产生线图。你是在问一些关于数据,关于查询,或者如何制作线条图的问题? –

回答

0

你可以计算出标签值存储在一个单独的表ttbl(你永远不会改变的任何值,而是始终insert他们那里!):

tid | uid | tag | changed 
------------------------------------------ 
    1 | 1 | 5 | '2017-09-24T15:34:23' 
    2 | 1 | 8 | '2017-09-24T15:36:23' 
    3 | 2 | 3 | '2017-09-24T15:38:23' 
    4 | 3 | 2 | '2017-09-24T15:40:23' 
    5 | 4 | 1 | '2017-09-24T16:34:23' 
    6 | 5 | 4 | '2017-09-24T16:44:23' 
    7 | 1 | 5 | '2017-09-24T18:14:23' 
    8 | 6 | 6 | '2017-09-24T18:24:23' 
    9 | 1 | 9 | '2017-09-24T18:34:23' 
10 | 7 | 10 | '2017-09-24T18:44:23' 
11 | 1 | 5 | '2017-09-25T15:31:23' 
12 | 8 | 11 | '2017-09-25T15:32:23' 
13 | 9 | 9 | '2017-09-25T15:33:23' 
14 | 10 | 15 | '2017-09-25T15:34:23' 
15 | 11 | 17 | '2017-09-25T15:35:23' 
16 | 12 | 31 | '2017-09-25T15:36:23' 

注意,对于UID = 1个,从变化的标记值随着时间的推移5到8,5,9再次回到5。

现在,用特制的选择捡出特定截止点最新值在时间这样的:

SELECT t.* FROM ttbl t 
INNER JOIN (SELECT uid i, max(changed) dt 
      FROM ttbl WHERE changed<'20170925' 
      GROUP BY uid) u ON i=uid AND dt=changed; 

的日期值'20170925'这里表示截止时间。随意加入这与您目前的评级值或其他东西的表。

你可以在这里找到一个小演示:http://rextester.com/GZNL52987

0

可以使用trigger来排名的值存储的另一个表内。

我会定义新的表是这样的:

CREATE TABLE `tag_history` (
    `id` int(11) NOT NULL, 
    `tag` int(8) NOT NULL, -- 8 seems to be enough for your needs 
    `player` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
); 

ALTER TABLE `tag_history` ADD PRIMARY KEY (`id`); 
ALTER TABLE `tag_history` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 

使用这种触发:

CREATE TRIGGER AFTER UPDATE ON `my_table_name` 
FOR EACH ROW 
BEGIN 
    IF NEW.tag <> OLD.tag THEN 
     INSERT INTO `tag_history` (tag, player) VALUES (NEW.tag, NEW.name); 
    END IF; 
END; 

CURRENT_TIMESTAMP为默认值timestamp会自动将您UPDATE的日期和时间,店内的行。

或者,因为您标记了这个问题PHP,您可以简单地在您的PHP脚本中更新您的表时使用INSERT INTO tag_history,而无需使用任何触发器。

但是这意味着您将不得不将未来的更新存储到您的表中,然后才能够绘制任何图形,因为您没有输入的时间戳。