sql查询有两个连接和一个简单的逻辑

时间:2017-11-14 09:08:06

标签: php mysql

请找小提琴 http://sqlfiddle.com/#!9/4a4aff/7

好友列表

 | id | user_id | Friend_id | status
 |  1 |   1     |    24     |   P
 |  2 |   18    |    26     |   P

用户

| ID | email   | password  |  ..N
 |  1 |   xx    |    xx     |   xx
 |  2 |   xx    |    xx     |   xx

从这两个表我希望得到列出的所有用户没有在朋友列表中状态为P或B的用户,使用连接似乎很简单但在wordpress中这个代码不起作用,查询如下。

select DISTINCT u.ID, u.user_nicename from wp_users u
LEFT JOIN friends_list f ON f.friend_id=u.ID
WHERE f.status  NOT IN ('P', 'B')

5 个答案:

答案 0 :(得分:3)

您必须使用如下所示的用户ID连接表:

LEFT JOIN friends_list f ON f.user_id = u.ID

select DISTINCT u.ID, u.user_nicename from wp_users u
    LEFT JOIN friends_list f ON f.user_id=u.ID
    WHERE f.status  NOT IN ('P', 'B')

friends_list 表格中添加两条记录,其中包含 Q Z 状态以进行测试

INSERT INTO `friends_list` (`id`, `user_id`, `Friend_id`, `status`) VALUES
(80, 1, 26, 'P'),
(79, 18, 26, 'P'),
(78, 1, 24, 'P'),
(79, 20, 24, 'Q'),
(80, 21, 24, 'Z');

sqlfiddle working example

答案 1 :(得分:2)

根据我的理解,除了那些有P或B状态的用户外,你想要所有用户。要获得那些在friends_list表中没有值的用户,您可以在查询中添加空检查。

select DISTINCT u.ID, u.user_nicename from wp_users u
LEFT JOIN friends_list f ON f.friend_id=u.ID
WHERE f.status NOT IN ('P', 'B') OR f.status IS NULL

我也不确定你是否加入了正确的专栏?它应该是user_id而不是friend_id吗?

答案 2 :(得分:1)

只需像这样更改绑定列: -

select DISTINCT u.ID, u.user_nicename from wp_users u
LEFT JOIN friends_list f ON f.user_id=u.ID
WHERE f.status NOT IN ('P', 'B');

答案 3 :(得分:1)

更改您的查询,如下所示。如果您只想要第一个表中的数据,那么不需要连接查询只使用内部查询

select DISTINCT u.ID, u.user_nicename from wp_users u WHERE u.ID not in 
(select f.friend_id from friends_list f where f.status IN ('P', 'B')) order by u.ID;

Fiddle

修改

select DISTINCT u.ID, u.user_nicename from wp_users u
LEFT JOIN friends_list f ON f.friend_id=u.ID
WHERE f.status NOT IN ('P', 'B') OR f.status IS NULL ORDER BY u.ID

答案 4 :(得分:1)

您可以使用此查询,您的小提琴显示空白结果,因为您只有P Status的数据,尝试添加一个具有其他状态的条目,然后您将获得结果。

select DISTINCT u.ID, u.user_nicename from wp_users u left join friends_list f 
on f.friend_id=u.ID where f.status is NULL