我有一个查询,该查询应该显示特定用户访问过的页面名称。用户表有一列包含用户已访问的页面 ID 的 CSV。 页面名称位于另一个具有相应页面 ID 的表中。
这是两个表的结构
+------------+---------------------+
| 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')
此查询仅显示 1 个页面名称,而不是表结构中所示的 2 个页面名称。
如何使用这 2 个表结构检索特定用户的所有页面?
提前致谢。
最佳答案
这不是最好的结构,但我相信您可以使用以下查询来管理它: (不过,我强烈建议规范化用户页表,以便为每个记录引用创建一个页面 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,
姓名varchar(25) NOT NULL,
PRIMARY KEY (
ID )
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE IF NOT EXISTS
用户(
ID int(10) unsigned NOT NULL AUTO_INCREMENT,
姓名varchar(25) NOT NULL,
PRIMARY KEY (
ID )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS
用户页面(
用户ID int(10) unsigned NOT NULL,
页面ID int(10) unsigned NOT NULL,
PRIMARY KEY (
用户ID ,
页面ID )
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
现在页表列出了所有可用的页。用户表仅列出用户名和用户 ID。神奇的事情发生在 userpages 表中。您在页面和用户之间进行相关引用(权利?)。
您现在可以使用以下 SQL 查询来查询页面:
SELECT p.id, p.name FROM page p, user u, userpages up WHERE u.name = 'john01' and u.id = up.userid AND up.pageid = p.id
关于mysql - 在 MySQL 中使用 CSV 列作为条件显示所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685950/