1

“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]
在“wall”表中,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"

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

4

1 回答 1

2

如果必须使用 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

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

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

会是以下几个原因:

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

请参阅:多对多关系:在列中使用关联表或分隔值?进行类似的讨论。

于 2013-04-25T21:25:55.867 回答