【问题标题】:Showing posts according to the level of authority in mysql根据mysql中的权限级别显示帖子
【发布时间】:2013-04-19 21:02:55
【问题描述】:

“user”表列名称为“id”、“username”、“name_surname”、“password”。
“friends”表列名称为“user_id”、“friends”、“requests”、“bans”。
“wall”表列名称为“id”、“post”、“access”、“date”、“owner_id”、“poster_id”。

当用户访问他的帐户页面时,他正在像 facebook 一样写下“他的想法”,他可以选择谁可以阅读该帖子。但是当他要阅读墙的帖子时,他一定不能阅读所有帖子。他只有在他的 id 位于海报的朋友栏时才能阅读。

例如,我的 id 是 3,poster id 是 5,friends 字段将值保存为 jason 数据。
在“user”表中,id=>3,username=>user1,name=>John,password=>1234
在“friends”表中,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的用户,所以可以看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"

请您帮我编写正确的查询吗? 亲切的问候。

【问题讨论】:

  • 最好为每个朋友设置不同的行,而不是使用 JSON 数组。你的朋友表应该是:user_id、friend_id、requests、bans
  • 现在太晚了。所有的友谊系统和其他基于这个逻辑。 :)
  • 为什么没有多对多表?你确定吗?因此,您需要一个查询:正确显示墙壁,但仅根据访问中指定的发布者显示允许用户查看的帖子...
  • 相反,少了表。因为如果用户有 100 个朋友,正如你所说,它需要 100 个不同的行。但在 json 数据格式中,一个用户需要一行。反正没关系。你能帮我编写 sql 查询代码来解决我的问题吗?
  • 请参阅stackoverflow.com/questions/786918/…,这正是我们正在讨论的内容。 JSON 数组本质上是一个分隔列表。

标签: mysql


【解决方案1】:

如果必须使用 JSON 数组存储朋友,则类似下面的方法可以工作。 我正在使用 like 搜索您的朋友的 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

但是,正如我在 cmets 中发布的那样,我认为对于朋友来说,使用 2 个外键整数的多对多表 -> (user_id,friend_id) 会更好。

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

原因如下:

  1. 无需执行字符串搜索。
  2. 基于 varchar 好友字段大小的好友数量没有限制。
  3. 将数字数据 (id) 编码为字符串,比编码为整数消耗更多的内存。
  4. 多对多表的查询要简单得多。

有关类似讨论,请参阅:Many-to-many relationship: use associative table or delimited values in a column?

【讨论】:

  • 非常感谢。现在,我在工作。尽快,我会试试的。在你的帮助下,我相信我会解决问题的。
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多