举个例子,假设我希望用户成为网站上的朋友。
说,user_id 1和user_id 2成为朋友,我向我的朋友们添加一行: 表朋友(user_id1 INT,user_id2 INT),这个表的问题是我必须查询每一列才能得到我的结果。
行可能是:
user_id1 user_id2
1 2
2 3
因此,为了获得ID为2的用户的朋友,我需要查询两个列(这使得一些不那么实用的查询),有更好的方法吗?
ie:
$u_id = 2;
SELECT * FROM friends WHERE (user_id1 = $u_id OR user_id2 = $u_id)
答案 0 :(得分:0)
你可以尝试一种不同的方法,将一个人的所有朋友存储在表中的朋友字段中,并将所有内容存储为json对象。
通过这种方式,您可以在一个查询中拥有所有一个人的朋友,并且您可以使用简单的foreach查询获取tehir个人资料。
我已经将它用于多个多对多逻辑,并且无需链接表即可完美运行。
答案 1 :(得分:0)
我认为我更喜欢UNION
,例如:
SELECT user, friend FROM (
SELECT user_id1 AS user, user_id2 AS friend FROM friends
UNION
SELECT user_id2 as user, user_id1 AS friend FROM friends
) u
WHERE u.user = $u_id
(关于使用预备语句而不是使用裸变量的适当注意事项)
答案 2 :(得分:0)
我会选择空间效率较低的方法来添加两行,一个将人A链接到人B,将第二个链接人B链接到人A.然后,单个列上的单个查询将检索所有朋友。
此设置也可用于“朋友”拥有不同特权或级别的友谊的地方。所以A人可以给予B更多的东西,而不是B给A的东西。