2014-01-21 115 views
0

我编码一个社交型网站,用户有朋友和我试图创建一个动作一个新闻源,他们的朋友都做不成MYSQL在替代

我有三个表

用户

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' 

自“约翰”是朋友“鲍勃,‘约翰’应该能看到‘鲍勃’行动‘妮可’

编辑::我也想从另一个方向的动作如果“妮可”发送至“鲍勃”

我目前的解决方案的作用是:

有一个包含用户的所有朋友的字符串:$朋友=“1,2,3,4 .. ..等'

查询:

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

是否在朋友表中的id列起任何作用? – Strawberry

+0

它的服务器没有目的,你会建议删除它吗? – user3023421

+0

你的另一个选择是,加入表格并进行查询,但如果我没有错,“IN”状态比加入表 – semirturgay

回答

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个行动。)