我正在编写一个社交网络类型的网站,用户有朋友,我试图创建一个新闻馈送与他们的朋友所做的行动
我有三张桌子
用户
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‘的动作
编辑::如果'nicole‘向'bob’发送一个动作,我也想从另一个方向获取动作。
我目前的解决方案是:
有一个包含用户所有好友的字符串:$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上面的查询是有效的,但我的问题是,当用户开始有数百个朋友时,这个查询会慢得可怕,我能做些什么来防止这种情况?
发布于 2014-01-22 01:34:58
它非常适合您当前的需求。
发布于 2014-01-22 01:39:17
使用JOIN来实现这一点怎么样?
SELECT actions.*
FROM actions a
JOIN friends f ON f.who = a.owner
WHERE f.uid = (current user's ID)
LIMIT 15(返回当前用户的好友拥有的15个操作。)
https://stackoverflow.com/questions/21265133
复制相似问题