如何将选择限制为仅具有共同值的行?

Posted

技术标签:

【中文标题】如何将选择限制为仅具有共同值的行?【英文标题】:How can I restrict selecting to only rows which have common value? 【发布时间】:2017-07-02 09:04:30 【问题描述】:

这是我的表结构:

// users
+----+--------+
| id |  name  |
+----+--------+
| 1  | Jack   |
| 2  | Peter  |
| 3  | John   |
| 4  | Barman |
| 5  | Ali    |
+----+--------+

// friends
+---------+-----------+
| user_id | friend_id |
+---------+-----------+
| 1       | 3         |
| 1       | 4         |
| 1       | 5         |
| 3       | 1         |
| 3       | 2         |
| 3       | 4         |
| 5       | 2         |
+---------+-----------+

-- both user_id and friend_id columns refer to the id column of users table

这是我的查询:

// $id = 1;
select distinct f1.user_id, f1.friend_id
from friend f1
where user_id = $id
      or 
      user_id in (select f2.friend_id
                  from friend f2
                  where user_id = $id);
/* output
| 1       | 3         |
| 1       | 4         |
| 1       | 5         |
| 3       | 2         |
| 3       | 4         |
| 5       | 2         |

如您所见,我的查询选择了

Jack(因为$id = 1Jack 的所有好友 Jack的好友的所有好友

好的,一切都好。实际上,我正在尝试制作结果图表。实际上我做到了。现在我想将结果限制为只有普通朋友。我的意思是我想删除单个节点。换句话说,我想选择至少有两条边的朋友。

是否可以通过更改查询来做到这一点,还是应该在 php 层中做到这一点?


视觉示例及其预期输出:

【问题讨论】:

在第二个 select .. 添加一个选择计数条件,应该可以完成这项工作。 更新您的问题并添加您选择的实际结果和预期结果..(基于您的数据样本) @scaisEdge 预期输出已添加。 我不明白您的预期输出。您正在寻找朋友的朋友,对吗?那么为什么会有 1 - 3 和 1 - 4 呢? 【参考方案1】:

下面的查询将返回所有非直接好友的普通好友:

select distinct f.user_id, f2.friend_id common_friend
from friends f
inner join friends f2
      on f.friend_id = f2.user_id
left join friends f3
      on f.user_id = f3.user_id
      and f2.friend_id = f3.friend_id
where f3.user_id is null
and f.user_id <> f2.friend_id
#and f.user_id = 1 Jack

第一个“inner”加入返回朋友圈,第二个“left”加入加入圈内的一阶朋友-> f3.user_id 为空的地方删除一阶朋友。 最后一个f.user_id &lt;&gt; f2.friend_id 是删除一个用户作为自己的共同朋友。

【讨论】:

【参考方案2】:

试试这个

SELECT DISTINCT f1.user_id, f1.friend_id
FROM friend f1
WHERE (
   user_id = $id
   OR user_id IN (
      SELECT f2.friend_id
      FROM friend f2
      WHERE user_id = $id)) 
   AND (friend_id  IN (
      SELECT f3.friend_id
      FROM friend f3
      WHERE user_id = $id))

【讨论】:

以上是关于如何将选择限制为仅具有共同值的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个表中选择同一字段中具有相同值的行?

在 Wordpress 中,如何将帖子限制为仅一个类别复选框?

POSTGRES:如何仅在另一个值不存在时选择具有某个值的行,在这种情况下选择另一个值?

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

选择联结表中具有多个值的行

选择具有多个重复字段值的行