MYSQL IN 替代方案

标签 mysql

我正在编写一个社交网络类型的网站,用户有 friend ,我正在尝试使用他们的 friend 所做的操作创建新闻提要

我有三张 table

用户

id     |    username
---------------------
1      |    john
2      |    nicole
3      |    bob

friend

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”的 friend ,“john”应该能够看到“bob”对“nicole”的操作

编辑::如果“nicole”向“bob”发送操作,我还想从另一个方向获取操作

我当前的解决方案是:

有一个包含用户所有 friend 的字符串:$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

上面的查询有效,但我的问题是,当用户开始有数百个 friend 时,此查询将非常慢,我可以采取什么替代方法来防止这种情况发生?

最佳答案

如果您想尝试不同的更好的解决方案,请尝试使用任何流行的图形数据库。它非常适合您当前的要求。

关于MYSQL IN 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265133/

相关文章:

mysql - 如何在mysql中将varchar转换为bigint

sql - MySQL 2级MENU查询

php - 向mysql插入数据,只插入第一个日期

MySql 多表与单表 : performance

php - 在 where 子句中选择具有长比较的记录的最佳技术是什么

php - 如果没有正确显示结果

mysql - 如何在 docker swarm 中的两个服务之间建立连接?

c# - Unity3D 数据库在编辑器中检索,但在编译 C# 时则不然。在其他地方追回罚款

mysql - 仅来自日期时间列的时间

MySQL 查询与 GROUP BY 或 DISTINCT 相反吗?