使用mysql查询获取user3而不是user1

hsgswve4  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(171)

我有一个叫用户
| id|姓名|用户名|
| - -----|- -----|- -----|
| 1|约翰|用户1|
| 2|玛丽|用户2|
| 3|水桶|用户3|
第二表关系
| id|追随者|followId|
| - -----|- -----|- -----|
| 1| 2| 1|
我想使用sql查询来获取user 3而不是user 1

export const getUsers = (req, res) => {
   const q ="SELECT  r.*, u.id AS userId, name, profilePic FROM relationships AS r RIGHT JOIN users AS u ON r.followerUserId = u.id";

   db.query(q, (err, data) => {
       if (err) return res.status(500).json(err);
            return res.json(data);
   });
};

但我会让所有用户

72qzrwbm

72qzrwbm1#

我的建议是:永远不要使用右外连接。如果需要外部联接,请使用左外部联接。
您有:

SELECT  r.*, u.id AS userId, name, profilePic
FROM relationships AS r
RIGHT JOIN users AS u ON r.followerUserId = u.id

其等于:

SELECT  r.*, u.id AS userId, name, profilePic
FROM users AS u 
LEFT JOIN relationships AS r ON r.followerUserId = u.id

所以你说:显示所有用户,不管他们是否有关系条目。如果他们跟随其他人,展示所有这些关系。
这根本不是你所描述的任务。你只想要那些不关注用户#1的用户,或者我理解这一点。而且你似乎也不希望用户#1自己。
(It有点奇怪,在你的查询中没有对用户#1的引用。你认为DBMS会猜到这应该是关于用户#1的吗?)

SELECT *
FROM users
WHERE id NOT IN (SELECT followerid FROM relationships WHERE followId = 1)
and id <> 1;
vawmfj5a

vawmfj5a2#

由于您没有引用用户,而您特别需要user3,或者扩展为“people”,而不是关注user1,因此您可以创建一个关于它的查询。
我们可以使用NOT EXISTS来收集满足以下两个条件之一的用户:

  • 用户是user1(我们想要不关注user1的人,我猜我们不想要user1自己)
  • 用户是关注者,并且用户关注user1
SELECT u.*
FROM users u
WHERE NOT EXISTS (SELECT 1
                  FROM relationships r 
                  WHERE (u.id = r.followerId AND r.followId = 1) 
                     OR u.id = 1)

一旦查询是tested,您可以将其移动到代码中,这将变成如下所示:

export const getUsers = (req, res) => {
   const q ="SELECT u.* FROM users u WHERE NOT EXISTS (SELECT 1 FROM relationships r WHERE (u.id = r.followerId AND r.followId = 1) OR u.id = 1)";

   db.query(q, (err, data) => {
       if (err) return res.status(500).json(err);
            return res.json(data);
   });
};

尽管我注意到您还选择了在所示示例表中不可用的其他字段,但这应该为您提供了一个可靠的基线来进行扩展。

相关问题