sqlFiddle demo 基于您在另一个链接问题中解释的friendship schema。
/* --------------get users who are not friends with 'Tim' */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
FROM friendship f
WHERE f.id_user = u1.id AND
f.id_friend = u2.id)
AND NOT EXISTS(SELECT 1
FROM friendship f
WHERE f.id_user = u2.id AND
f.id_friend = u1.id)
AND u1.id != u2.id
AND u1.id = 1;
/* ---------------get users who have not asked 'Tim' to be a friend*/
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
FROM friendship f
WHERE f.id_user = u2.id AND
f.id_friend = u1.id)
AND u1.id != u2.id
AND u1.id = 1;
/* ------------- get users who have not been asked by 'Tim' to be a friend */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
FROM friendship f
WHERE f.id_user = u1.id AND
f.id_friend = u2.id)
AND u1.id != u2.id
AND u1.id = 1;
所有三个查询都已设置为基于Tim 和u1.id = 1 搜索数据,只需将最后一个条件更改为您要查找的任何用户ID。
第一个查询可以组合成一个OR 条件,如下所示
/* get users who are not friends with 'Tim' */
SELECT u2.id,u2.name
FROM users u1,users u2
WHERE NOT EXISTS(SELECT 1
FROM friendship f
WHERE (f.id_user = u1.id AND
f.id_friend = u2.id)
OR(f.id_user = u2.id AND
f.id_friend = u1.id))
AND u1.id != u2.id
AND u1.id = 1;
左连接解决方案sqlFiddle(您必须将 1 的 id 比较替换为您选择的用户 id,它们在第一个查询中出现 3 次,在第二个和第三个查询中出现两次)
/* get users who are not friends with 'Tim' */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
(u.id=f.id_user AND f.id_friend = 1)
OR(u.id=f.id_friend AND f.id_user = 1)
WHERE
f.id_friend IS NULL
AND u.id != 1;
/* get users who have not asked 'Tim' to be a friend */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
(u.id=f.id_user AND f.id_friend = 1)
WHERE
f.id_friend IS NULL
AND u.id != 1;
/* get users who have not been asked by 'Tim' to be a friend */
SELECT u.id,u.name
FROM users u
LEFT JOIN friendship f ON
(u.id=f.id_friend AND f.id_user = 1)
WHERE
f.id_friend IS NULL
AND u.id != 1;