2015-04-16 45 views
0

我有一個查詢應該顯示一個特定用戶訪問過的頁面名稱。 users表中有一列包含用戶訪問過的頁面id的CSV。 頁面的名稱位於另一個帶有相應頁面ID的表格中。在MySQL中使用CSV列顯示所有值作爲條件

這裏是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

這是不是要走的最佳結構,但我相信你可以使用這個查詢進行管理:(我不過強烈建議規範化用戶頁表,使每個記錄參考單頁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 userpages ( 用戶ID int(10) unsigned NOT NULL, pageid int(10) unsigned NOT NULL, PRIMARY KEY ( userid , pageid ) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

現在頁面表列出了所有可用的頁面。用戶表只是列出用戶名到用戶名。神奇的事發生在用戶頁面表中。您在哪裏製作頁面和用戶之間的相關參考資料(權利?)。

您現在可以使用下面的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

+0

它沒有工作。對不起 – vishnu

+0

我將用更好的解決方案編輯我的答案。 – Armand

相關問題