选择不属于另一个表中的一对的条目

时间:2017-03-18 15:07:33

标签: mysql sql

Tables:

     users            friends
+-------+----+    +-----+-----+    
| name  | id |    | id1 | id2 |
+-------+----+    +-----+-----+
| user1 | 1  |    |  1  |  2  |
+-------+----+    +-----+-----+
| user2 + 2  | 
+-------+----+ 

在我的数据库id1表格中friends是显性列,这意味着如果id1 = 1id2 = 2user1user2的朋友users 1}}但不是相反。

我正在尝试从X表中选择id1表中friends userX SELECT * FROM users LEFT JOIN friends ON users.id != friends.id2 WHERE friends.id1 = X AND users.id != X;作为users.id != X的所有用户。这是因为我不希望 <section class="about"> <div class="container"> <div class="row"> <div class="one-third column"> <img class="u-max-full-width" src="images/person.png" alt="Person" height="300" width="200"> </div> <div class="two-thirds column"> <h4>About</h4> <p>Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam quam nunc, blandit vel, luctus pulvinar, hendrerit id, lorem.</p> <p>Maecenas nec odio et ante tincidunt tempus. Donec vitae sapien ut libero venenatis faucibus. Nullam quis ante. Etiam sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc</p> </div> </div> </div> </section> 能够找到他已经添加的朋友。

这是我失败的尝试:

{{1}}

我添加了{{1}},因为我们不想在搜索其他用户时自行返回用户。

2 个答案:

答案 0 :(得分:1)

您可以使用外部联接来执行此操作,您尝试进入正确的方向:

select u.*
from        users u
left join   friends f
on  u.id = f.id2
where f.id1 is null

外部联接至少为每个不匹配的项目返回NULL

答案 1 :(得分:0)

使用not in() (more efficient than not exists() in mysql)

select *
from users
where id != xi
  and id not in (
  select id.2
  from friends
  where friends.id1 = x
  )

使用not exists()

select *
from users
where id != x 
  and not exists (
  select 1
  from friends
  where friends.id1 = x
    and friends.id2 = users.id
  )