根据mysql中的权限级别显示帖子

时间:2013-04-25 20:01:38

标签: mysql

“user”表的列名称是“id”,“username”,“name_surname”,“password”。
“朋友”表的列名称是“user_id”,“friends”,“requests”,“bans” “wall”表的列名是“id”,“post”,“access”,“date”,“owner_id”,“poster_id”。

当用户访问他的accound页面时,他正在写像facebook上的“他的想法”,他可以选择谁可以阅读帖子。但是当他想阅读墙上的帖子时,他一定不能阅读所有帖子。他只能阅读他的身份证是否位于海报的朋友专栏。

例如,我的id为3,poster id为5,friends字段将值保存为jason数据 在“用户”表格中,id => 3,username => user1,name => John,password => 1234
在“朋友”表中,user_id => 5,friends => [1,2,3,4,7,8],requests => [11,12,13],bans => [31,32 ,33]
在“墙”表中,id => 1,posts =>在这里我认为,access => friends_only,date => 2013-04-25 19:23:00,owner_id => 7,poster_id = 5个

根据上面的信息,我是id = 3,id = 5用户的firend,所以我可以阅读id = 1的墙贴。在所有胃痛,我没有设法编写SQL查询。这是我荒谬的疑问。

"SELECT w.*, u.* FROM wall AS w"
    . " LEFT JOIN user AS u ON u.id=w.poster_id"
    . " WHERE w.access='everybody'"
    . " OR (SELECT * FROM wall WHERE w.access='friends_only'"
    . " IN (SELECT * FROM friends WHERE friends contains 3) )"
    . " ORDER BY w.id DESC LIMIT 0,5"

请问你能帮我写一个正确的查询吗? 亲切的问候。

1 个答案:

答案 0 :(得分:2)

如果必须使用JSON数组存储朋友,下面的内容可能会起作用。 我正在使用喜欢搜索你的JSON字符串的朋友。

select * from 
wall w,  
friends f
where 
w.poster_id = f.user_id and
(
    access = "all" or
    (
    f.friends like '[LOGGED_IN_USER_ID%' or
    f.friends like '%,LOGGED_IN_USER_ID,%' or
    f.friends like '%LOGGED_IN_USER_ID]'
    )
)
and
f.user_d = w.owner_id and
w.owner_id = WALL_OWNER_ID

两个输入是:

  • LOGGED_IN_USER_ID
  • WALL_OWNER_ID

然而,正如我的评论中所发表的,我认为对于朋友来说,使用2个外键整数的多对多表 - > (user_id,friend_id)会更好。

  • friend_id将引用users.user_id
  • user_id将引用users.user_id

出于以下原因:

  1. 无需执行字符串搜索。
  2. 基于varchar friends字段大小的朋友数量没有限制。
  3. 将数字数据(ids)编码为字符串,比编码为整数消耗更多内存。
  4. 使用多对多表格查询更简单。
  5. 请参阅:Many-to-many relationship: use associative table or delimited values in a column?进行类似的讨论。