如何限制只选择具有共同价值的行?

时间:2017-02-14 07:13:47

标签: php mysql arrays

这是我的表结构:

// 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 = 1
  • 所有Jack朋友
  • Jack朋友
  • 的所有朋友

好的很好。实际上,我试图制作结果图。实际上我做到了。现在我想将结果仅限于普通朋友 。我的意思是我想删除单个节点。换句话说,我想选择至少两条边的朋友。

通过更改查询可以做到这一点,还是应该在PHP层中执行此操作?

可视化示例及其预期输出:

enter image description here

2 个答案:

答案 0 :(得分:0)

bellow查询将返回非直接朋友的所有常见朋友:

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

第一个“内部”联接返回朋友圈,第二个“左”联接加入圈子中的第一个朋友 - &gt; f3.user_id为null的地方删除了一阶朋友。 最后一个f.user_id <> f2.friend_id是删除用户是他自己的共同朋友。

答案 1 :(得分:0)

试试这个

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))