使用CSV列显示所有值作为MySQL中的条件

时间:2015-04-16 21:05:12

标签: mysql csv pdo

我有一个查询,它应该显示特定用户访问过的页面名称。 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表结构检索特定用户的所有页面?

提前致谢。

1 个答案:

答案 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 (