我正在编写一个社交网络类型的网站,用户有朋友,我正在尝试使用他们的朋友已完成的操作创建新闻Feed
我有三张桌子
用户
id | username
---------------------
1 | john
2 | nicole
3 | bob
友
id | uid | who
----------------------------
1 | 1 | 2
2 | 2 | 1
3 | 2 | 3
4 | 3 | 2
5 | 3 | 1
6 | 1 | 3
操作
id | owner | to_id | message
-------------------------------------------
1 | 3 | 2 | 'hello'
2 | 3 | 1 | 'yoooo'
由于'john'是'bob'的朋友,'john'应该可以看到'bob'动作'nicole'
编辑::如果'妮可'向'鲍勃'发送动作,我也希望从另一个方向获取行动
我目前的解决方案是:
有一个字符串,其中包含用户的所有朋友:$ friends ='1,2,3,4 .... etc'
查询:
SELECT
`Actions`.*
FROM
`Actions`
WHERE
(`Actions`.`to_id` IN (${friends}) OR `Actions`.`from_id` IN (${friends}))
AND
( `Actions`.`to_id` != (${logged_id} AND `Actions`.`from_id` != (${logged_id})
ORDER BY
`Actions`.`time` ASC
LIMIT
15
上面的查询有效,但我的问题是,当用户开始有数百名朋友时,这个查询会非常慢,我可以做些什么来防止这种情况?
答案 0 :(得分:1)
如果您想尝试其他更好的解决方案,请尝试使用任何流行的图形数据库。它非常适合您当前的要求。
答案 1 :(得分:1)
使用JOIN实现这个目标怎么样?
SELECT actions.*
FROM actions a
JOIN friends f ON f.who = a.owner
WHERE f.uid = (current user's ID)
LIMIT 15
(返回当前用户的朋友拥有的15个动作。)