0

我在mysql数据库中有一个用户表,如下所示:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| username    | varchar(255) | YES  |     | NULL    |                |
| password    | varchar(255) | YES  |     | NULL    |                |
| recent      | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

我需要保存用户查看的最后 20 个 ID。我的第一直觉是使用字符串来保存逗号分隔的列表,但这违反了规范化。我只需要保存 20 个 ID,并且是某个特定的用户查看了它们。

我能想出的最好的方法是保持标准化,是这样的:

users
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| username    | varchar(255) | YES  |     | NULL    |                |
| password    | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

users_pages
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| users_id    | int(11)      | YES  | MUL | NULL    |                |
| pages_id    | int(11)      | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

pages
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| page01      | int(11)      | YES  |     | NULL    |                |
| page02      | int(11)      | YES  |     | NULL    |                |
| page03      | int(11)      | YES  |     | NULL    |                |
| page04      | int(11)      | YES  |     | NULL    |                |
| page05      | int(11)      | YES  |     | NULL    |                |
| page06      | int(11)      | YES  |     | NULL    |                |
| page07      | int(11)      | YES  |     | NULL    |                |
| page08      | int(11)      | YES  |     | NULL    |                |
| page09      | int(11)      | YES  |     | NULL    |                |
| page10      | int(11)      | YES  |     | NULL    |                |
| page11      | int(11)      | YES  |     | NULL    |                |
| page12      | int(11)      | YES  |     | NULL    |                |
| page13      | int(11)      | YES  |     | NULL    |                |
| page14      | int(11)      | YES  |     | NULL    |                |
| page15      | int(11)      | YES  |     | NULL    |                |
| page16      | int(11)      | YES  |     | NULL    |                |
| page17      | int(11)      | YES  |     | NULL    |                |
| page18      | int(11)      | YES  |     | NULL    |                |
| page19      | int(11)      | YES  |     | NULL    |                |
| page20      | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

但我知道在列名中包含数字并不理想。另外,我不知道如何更新第 21 页视图上的表格。它需要通过将第 21 个页面视图放在 page20 列中进行更新,而 page20 变为 page19,page19 变为 page18,依此类推,直到 page2 变为 page1,并且旧的 page1 被遗忘。

我认为一种叫做 CASCADE 的东西可能很有用,但尽管谷歌搜索我无法清楚地理解它的含义或如何使用它。

如果有什么不同,我正在通过 PHP 访问 MySQL。

如果有人可以让我更好地了解如何处理这个问题,我将不胜感激。

4

1 回答 1

0

尝试这个:

select page_id 
    from users_pages 
    where user_id = @user_id 
    order by id desc limit 20.

这应该可以工作,因为 users_pages 的 id 是 auto_increment (和主键),除非您不按照访问的顺序保存页面视图,否则后代排序就可以了。

于 2013-06-13T21:44:51.710 回答