【发布时间】:2016-09-14 20:38:24
【问题描述】:
我有如下 3 个表
用户
- id integer primary_key
- user_name
朋友
- id autoincrement primary_key
- user1 integer foreign_key(User.id)
- user2 integer foreign_key(User.id)
订单
- id integer primary_key autoincrement
- product_id integer
- by_user foreign_key(User.id)
我已经获得了用户的 id 和 product_id 。
我必须编写一个查询,该查询将为我提供该用户下订单相同产品的所有朋友以及该用户下订单相同产品的所有朋友。 p>
如何在 mysql 中编写这样的查询?
示例数据说明
用户
id | name
------------------
1 | peter
2 | sam
3 | xang
4 | aisha
5 | rita
6 | mojo
7 | raj
8 | ben
朋友
(如果 id 为 1 和 2 的用户是朋友,则可以存储为 user1 = 1 和 user2 = 2 或 user1 = 2 和 user2 = 1 ,都表示用户之间的关系)
id user1 user2
---------------------------------------------
1 | 1 | 2
2 | 2 | 3
3 | 3 | 4
4 | 4 | 2
5 | 5 | 6
6 | 6 | 8
7 | 8 | 1
订单
id product_id by_user
-----------------------------------------------
1 | 100 | 2
2 | 100 | 3
3 | 100 | 4
4 | 100 | 5
5 | 100 | 7
6 | 101 | 5
7 | 102 | 6
8 | 103 | 1
所以提供的数据是:
用户 = 1 和产品 = 100
我们要做的:
id = 1 的用户的朋友是 [2,8](我们称之为 f1)
f1 中用户的朋友是 = [1,3,4,6](我们称之为 f2)
现在从订单表中给出用户 ID,该用户 ID 为 product_id = 100 并且用户 ID 在 f1+f2 中,即 [2,8,1,3,4,6]
所以这里的结果应该是:
[2,3,4]
【问题讨论】:
-
是
PLsql还是mysql?还添加您尝试过的内容.. -
“朋友”中的“id”主键是荒谬的。该表的主键应该是两列 user1 和 user2。
-
@MikeNakis。 . .这并不荒谬。关系表通常具有合成主键。一个合理的替代方案是复合主键。这两种选择都不“荒谬”。
-
@GordonLinoff 它允许多次输入关系。它没有任何用处,只会带来麻烦。许多人这样做的事实并不意味着它不是荒谬的。很多人也在第一次使用前声明了自己的变量,并将其初始化为零。这同样聪明。
-
@MikeNakis。 . .
unique约束足以表达唯一性。一方面,我发现自动递增列中的信息非常有用,例如插入值的顺序。
标签: mysql sql social-networking