我在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列中进行更新,而第20页变为第19页,第19页变为第18页等,直到第2页变为第1页,旧页面1被遗忘。
我认为CASCADE可能有用,但是尽管谷歌搜索我无法清楚地了解它的含义或使用方法。
如果它有所不同,我正在通过PHP访问MySQL。
如果有人能让我更好地了解如何处理这个问题,我真的很感激。
答案 0 :(得分:0)
试试这个:
select page_id
from users_pages
where user_id = @user_id
order by id desc limit 20.
这应该有效,因为users_pages的id是auto_increment(和主键),除非你没有按照访问它们的相同顺序保存页面视图,否则后代排序就可以了。