“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"
请问你能帮我写一个正确的查询吗? 亲切的问候。
答案 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
两个输入是:
然而,正如我的评论中所发表的,我认为对于朋友来说,使用2个外键整数的多对多表 - > (user_id,friend_id)会更好。
出于以下原因:
请参阅:Many-to-many relationship: use associative table or delimited values in a column?进行类似的讨论。