我有一个查询,它应该显示特定用户访问过的页面名称。 users表有一列,其中包含用户访问过的页面ID的CSV。 页面的名称位于另一个具有相应页面ID的表中。
以下是2个表的结构
+------------+---------------------+
| User Table | |
+------------+---------------------+
| USERID | PAGE |
| john01 | 101,102, |
| chris5 | 101,001,003,004,005 |
+------------+---------------------+
+------------+------------------+
| PAGE TABLE | |
+------------+------------------+
| PAGEID | PAGENAME |
| 101 | Account settings |
| 102 | Details |
| 001 | Setup account |
| 002 | Profile |
| 003 | Reset Password |
| 004 | Edit user |
| 005 | Manage accounts |
+------------+------------------+
我的问题是如何显示特定用户可访问的所有页面名称,如:
john01
我的查询是:
select pagename as Pages
from
Page
where
pageid in (select page from user where userid = 'john01')
此查询仅显示一个页面名称,但不显示表格结构中指示的2个页面名称。
如何使用此2表结构检索特定用户的所有页面?
提前致谢。
答案 0 :(得分:0)
这不是最好的结构,但我相信您可以使用此查询进行管理: (但我强烈建议规范化用户页面表,以便为每个记录引用生成一个页面ID。)
SELECT p.pagename FROM Pages p, User u WHERE u.userid = "john01" AND u.PAGE LIKE "%p.PAGEID%"
修改强> 我启动了PhpMyAdmin来重新创建查询,但是因为我认为编写这样的查询并不是我的本性。
我建议你像这样标准化你的表结构:
CREATE TABLE IF NOT EXISTS
页(
ID为int(10) unsigned NOT NULL AUTO_INCREMENT,
{名称{1}} ID为varchar(25) NOT NULL,
PRIMARY KEY (
)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
使用者CREATE TABLE IF NOT EXISTS
ID为(
{名称{1}} ID为int(10) unsigned NOT NULL AUTO_INCREMENT,
varchar(25) NOT NULL,
PRIMARY KEY (
{userpages {1}}的userid )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
的pageid CREATE TABLE IF NOT EXISTS
的userid (
的pageid int(10) unsigned NOT NULL,
现在页面表列出了所有可用页面。用户表只是将用户名列入用户ID。并且魔术发生在userpages表中。在页面和用户之间进行相关引用(权限?)的地方。
您现在可以使用以下SQL查询查询页面:
int(10) unsigned NOT NULL,
PRIMARY KEY (