The question you're asking appears subjective and is likely to be closed.
当我填写标题字段时,看到上述 可怕的警告 时,我并不感到惊讶。
我阅读了几乎所有谈论的话题,friends of friends
或者mutual friends
不确定我是否找到了我想做的正确解决方案。
对不起,我不擅长英语或SQL。
在不擅长两种语言的情况下,如何找到正确的答案?
我决定要问。我不会为down-vote
s或任何duplication warning
s失望。
当我想要答案时,我将尽可能真诚地写下来,以帮助您解决其他任何类似的问题。
我有一张与朋友关系的桌子。
FRIEND (TABLE)
-----------------------------------
PLAYER_ID(PK,FK) FRIEND_ID(PK,FK)
-----------------------------------
1 2 // 1 knows 2
2 1 // 2 knows 1
1 3 // 1 knows 3
2 3 // 2 knows 3
2 4 // 2 knows 4
2 5 // 2 knows 5 // updated
3 5 // 3 knows 5 // updated
1 100
1 200
1 300
100 400
200 400
300 400
两者composite primary keys
也是PLAYER
表中的外键。
我问并从这样的好人那里得到答案,因为他们“彼此认识”。
表中的熟人的SQL视图。
我有这样的看法。
ACQUAINTANCE (VIEW)
-----------------------------------
PLAYER_ID(PK,FK) FRIEND_ID(PK,FK)
-----------------------------------
1 2 // 1 knows 2
2 1 // 2 knows 1
您可能会注意到,这种关系的业务逻辑具有以下两个目的。
而且,现在,我想知道有什么好的方法可以
提前致谢。
如果此主题确实重复且不必要,我将关闭线程。
更新 - - - - - - - - - - - - - - - - - - - - - - - - - -------------
对于Rapha毛l Althaus的评论whose name is same with my future daughter
(是男孩的名字吗?),
3是friends of friends of 1
因为
1 knows 2
2 knows 3
但被排除在外是因为
1 already knows 3
基本上,我想以服务为given player
中
people he or she may know
which is not himself or herself // this is nothing but obvious
which each is not already known to himself
与上表
by 1 -> 2 -> 4 and 1 -> 3 -> 5
4 and 5 can be suggested for 1 as 'people you may know'
order by number of mutual friends will be perfect
but I don't think I can understand even if someone show me how. sorry.
谢谢你。
更新 - - - - - - - - - - - - - - - - - - - - - - - - - --------------------
我认为,FROM HERE WITH VARIOUS PEOPLE
即使这不是正确的答案,我也必须根据自己的经验逐步尝试。如果我做错了任何事情,请告诉我。
首先,让我自己加入FRIEND表本身。
SELECT *
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
打印
+-----------+-----------+-----------+-----------+
| PLAYER_ID | FRIEND_ID | PLAYER_ID | FRIEND_ID |
+-----------+-----------+-----------+-----------+
| 1 | 2 | 2 | 1 |
| 1 | 2 | 2 | 3 |
| 1 | 2 | 2 | 4 |
| 1 | 2 | 2 | 5 |
| 1 | 3 | 3 | 5 |
| 2 | 1 | 1 | 2 |
| 2 | 1 | 1 | 3 |
| 2 | 3 | 3 | 5 |
+-----------+-----------+-----------+-----------+
仅F2.FRIEND_ID
SELECT F2.FRIEND_ID
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
打印
+-----------+
| FRIEND_ID |
+-----------+
| 1 |
| 3 |
| 4 |
| 5 |
| 5 |
| 2 |
| 3 |
| 5 |
+-----------+
1只
SELECT F2.FRIEND_ID
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1;
打印
+-----------+
| FRIEND_ID |
+-----------+
| 1 |
| 3 |
| 4 |
| 5 |
| 5 |
+-----------+
不是1
SELECT F2.FRIEND_ID
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1
AND F2.FRIEND_ID != 1;
打印
+-----------+
| FRIEND_ID |
+-----------+
| 3 |
| 4 |
| 5 |
| 5 |
+-----------+
不是1的直接已知
SELECT F2.FRIEND_ID
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1
AND F2.FRIEND_ID != 1
AND F2.FRIEND_ID NOT IN (SELECT FRIEND_ID FROM FRIEND WHERE PLAYER_ID = 1);
印刷
+-----------+
| FRIEND_ID |
+-----------+
| 4 |
| 5 |
| 5 |
+-----------+
我想我要去那里。
更新 - - - - - - - - - - - - - - - - - - - - - - - - - ----------------
添加了以下路径
1 -> 100 -> 400
1 -> 200 -> 400
1 -> 300 -> 400
和最后一个查询打印(再次)
+-----------+
| FRIEND_ID |
+-----------+
| 4 |
| 5 |
| 5 |
| 400 |
| 400 |
| 400 |
+-----------+
最后,我得到了候选人:4、5、400
把distinct
肯定工作的首要目标
SELECT DISTINCT F2.FRIEND_ID
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1
AND F2.FRIEND_ID != 1
AND F2.FRIEND_ID NOT IN (SELECT FRIEND_ID FROM FRIEND WHERE PLAYER_ID = 1);
印刷
+-----------+
| FRIEND_ID |
+-----------+
| 4 |
| 5 |
| 400 |
+-----------+
而且,现在需要按相互计数的顺序进行订购。
这是每个候选人的共同朋友数。
+-----------+
| FRIEND_ID |
+-----------+
| 4 | 1 (1 -> 2 -> 4)
| 5 | 2 (1 -> 2 -> 5, 1 -> 3 -> 5)
| 400 | 3 (1 -> 100 -> 400, 1 -> 200 -> 400, 1 -> 300 -> 400)
+-----------+
我如何才能通过这么多共同的朋友来计算和排序?
SELECT F2.FRIEND_ID, COUNT(*)
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1
AND F2.FRIEND_ID != 1
AND F2.FRIEND_ID NOT IN (SELECT FRIEND_ID FROM FRIEND WHERE PLAYER_ID = 1)
GROUP BY F2.FRIEND_ID;
印刷
+-----------+----------+
| FRIEND_ID | COUNT(*) |
+-----------+----------+
| 4 | 1 |
| 5 | 2 |
| 400 | 3 |
+-----------+----------+
我得到了它!
SELECT F2.FRIEND_ID, COUNT(*) AS MFC
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F1.PLAYER_ID = 1
AND F2.FRIEND_ID != 1
AND F2.FRIEND_ID NOT IN (SELECT FRIEND_ID FROM FRIEND WHERE PLAYER_ID = 1)
GROUP BY F2.FRIEND_ID
ORDER BY MFC DESC;
印刷
+-----------+-----+
| FRIEND_ID | MFC |
+-----------+-----+
| 400 | 3 |
| 5 | 2 |
| 4 | 1 |
+-----------+-----+
有人可以确认吗?该查询是否最佳?将其作为视图时是否可能存在性能问题?
谢谢你。
我创建了一个视图
CREATE VIEW FOLLOWABLE AS
SELECT F1.PlAYER_ID, F2.FRIEND_ID AS FOLLOWABLE_ID, COUNT(*) AS MFC
FROM FRIEND F1 INNER JOIN FRIEND F2 ON F1.FRIEND_ID = F2.PLAYER_ID
WHERE F2.FRIEND_ID != F1.PLAYER_ID
AND F2.FRIEND_ID NOT IN (SELECT FRIEND_ID FROM FRIEND WHERE PLAYER_ID = F1.PLAYER_ID)
GROUP BY F2.FRIEND_ID
ORDER BY MFC DESC;
并经过测试。
mysql> select * from FOLLOWABLE;
+-----------+---------------+-----+
| PlAYER_ID | FOLLOWABLE_ID | MFC |
+-----------+---------------+-----+
| 1 | 400 | 3 |
| 1 | 5 | 2 |
| 2 | 100 | 1 |
| 2 | 200 | 1 |
| 2 | 300 | 1 |
| 1 | 4 | 1 |
+-----------+---------------+-----+
6 rows in set (0.01 sec)
mysql> select * from FOLLOWABLE WHERE PLAYER_ID = 1;
+-----------+---------------+-----+
| PlAYER_ID | FOLLOWABLE_ID | MFC |
+-----------+---------------+-----+
| 1 | 400 | 3 |
| 1 | 5 | 2 |
| 1 | 4 | 1 |
+-----------+---------------+-----+
3 rows in set (0.00 sec)
使用此 编辑
SELECT `friend_id` AS `possible_friend_id`
FROM `friends`
WHERE `player_id` IN ( --selecting those who are known
SELECT `friend_id` --by freinds of #1
FROM `friends`
WHERE `player_id` = 1)
AND `friend_id` NOT IN ( --but not those who are known by #1
SELECT `friend_id`
FROM `friends`
WHERE `player_id` = 1)
AND NOT `friend_id` = 1 --and are not #1 himself
--if one is known by multiple people
--he'll be multiple time in the list
GROUP BY `possible_friend_id` --so we group
ORDER BY COUNT(*) DESC --and order by amount of repeatings
问题内容: 我正在研究“您可能认识的人”功能。我有两个表: 用户 id email name etc 朋友 user_id friend_id 对于每一次友谊,我都会做两个记录。假设用户7和9成为朋友…我要在友谊表中记录一条user_id = 7,friend_id = 9,另一条user_id = 9,friend_id = 7的记录。 如何根据朋友中的朋友进行sql查询,以建议我可能认识的人?
输入文件包含邻接列表,并具有以下格式的多行: 将类更改为静态后,这就是新的错误。 我觉得这是最麻烦的部分。 某些错误的屏幕快照
问题内容: 如何在 不引用 SQL表达式中的 特定列的情况下 选择所有可能包含已知特定值的记录? 例如,我知道,某个 未知 列包含值“ xxx”,并且表中有 许多列 和记录。 谢谢你。 问题答案: 因此,您想对数据库进行类似于Google的免费文本搜索。可以做到,但表演将是Teh Suck!Google之所以快速,是因为它在其索引上具有索引,重复的数据存储,并且通常针对这种搜索进行总体优化。 无论
问题内容: 我有一张表,其中列出了分布在五个不同列中的名称。我正在尝试获得6个最常见的不同名称。每个名称只会在每个记录中出现一次。这五列是name_1,name_2 … name_5。仅出于名称的缘故,将表称为“ mytable”。 任何帮助将非常感激。 问题答案: 这是一种方法: 表格中有几行?
问题内容: 我正在寻找一种选择方法,直到达到总和。 我的“文档”表中有“ ”和“ ”字段。 我想选择所有文档,但是我只能处理600个尺寸的文档。因此,当我知道前十个文件的总和已超过600个单位时,选择100个文件并丢弃其中的90个文件是没有意义的。 因此,目标是:当我要丢弃大部分数据时,不要带回大量数据进行解析。 …但是我也很想避免在此应用程序中引入使用游标的功能。 我正在使用mysql。 问题答
本文向大家介绍SQL 用CASE选择,包括了SQL 用CASE选择的使用技巧和注意事项,需要的朋友参考一下 示例 当需要动态应用结果时,可以使用CASE语句来实现它。 也可以链式 一个人也可以CASE在另一个CASE陈述中