社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL查询-待批好友/用户和好友之间的关系

zhaho • 3 年前 • 977 次点击  

我有两张桌子:

  • g_关系(id、请求id、接收者id、状态、已批准)
  • g_用户(包含:id、用户名等)

我很难做一个查询,添加一个临时列,检查userid:4是否存在于request_id或receiver_id列中,并从g_用户获取另一个userid和username,并将其添加到临时列中。

例如:假设我有userid 4。然后,我想选择g_关系,左键连接g_用户,并添加一列,检查我的用户id(4)是在request_id还是receiver_id列中,并获取不是我的用户id,检查它是哪个用户名,并用它填充新列。

例如:正确的结果如下:(如果我收到一个朋友请求)

身份证件 请求\u id 接收机识别码 地位 经核准的 朋友(新专栏)
1. 3. 4. 朋友 尼奥

但如果是我发出朋友请求的话,情况会是这样的

身份证件 请求\u id 接收机识别码 地位 经核准的 朋友(新专栏)
1. 4. 3. 朋友 尼奥

换句话说,查询应该始终检查我没有出现的列,并获取该用户ID,对照g_users表进行检查,然后将用户名从那里放入friend列。

这是我到目前为止的想法,但这只会检查然后请求_id不是4,也不会用用户名填充临时列“friend”:/

    SELECT *, ("friend" = CASE WHEN request_id != 4 THEN  END) as friend_id  
    FROM `g_relationships`
    LEFT JOIN g_users
    ON g_relationship.request_id = g_users.id
    WHERE request_id = 4 OR receiver_id = 4
    AND status = "friend"
    AND approved = "no"

有什么建议吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127959
 
977 次点击  
文章 [ 2 ]  |  最新文章 3 年前
O. Jones
Reply   •   1 楼
O. Jones    3 年前

你试过这个吗?它将在两个ID中的任何一个上连接。

...
LEFT JOIN g_users ON ( g_relationship.request_id = g_users.id OR
                       g_relationship.receiver_id = g_users.id )  
WHERE g_users.id = 4 
Beweeted
Reply   •   2 楼
Beweeted    3 年前

我写这篇文章有两种方式。两者都使用到g_users表的额外连接。第一个是一个查询,它可以得到您想要的输出,而第二个(在我看来)更可读,但使用了一个并集,从技术上讲是两个查询。

它们的输出相同。

沙盒设置:

CREATE TABLE g_relationships (
    id INT PRIMARY KEY,
    request_id INT,
    receiver_id INT,
    status VARCHAR(10),
    approved VARCHAR(10)
);

CREATE TABLE g_users (
    id INT PRIMARY KEY,
    username VARCHAR(20)
);

INSERT INTO g_users (id, username) VALUES
(1, "Jane"),
(2, "Bob"),
(3, "Sally"),
(4, "Frank");

INSERT INTO g_relationships (id, request_id, receiver_id, status, approved) VALUES
(1, 1, 3, "Friend", "No"),
(2, 1, 4, "Enemy", "No"),
(3, 4, 3, "Friend", "Yes"),
(4, 4, 2, "Friend", "Yes");

超级加入:

SELECT u.id, rel.request_id, rel.receiver_id, rel.status, rel.approved, u2.username AS FriendName
FROM g_relationships AS rel
JOIN g_users AS u
  ON (rel.request_id = u.id OR rel.receiver_id = u.id)
JOIN g_users AS u2
  ON (rel.request_id = u2.id OR rel.receiver_id = u2.id)
WHERE u.id != u2.id
  AND u.id = 4;

工会:

SELECT u.id, rel.request_id, rel.receiver_id, rel.status, rel.approved, u2.username AS FriendName
FROM g_relationships AS rel
JOIN g_users AS u
  ON rel.request_id = u.id
JOIN g_users AS u2
  ON rel.receiver_id = u2.id
WHERE u.id = 4

UNION

SELECT u.id, rel.request_id, rel.receiver_id, rel.status, rel.approved, u2.username AS FriendName
FROM g_relationships AS rel
JOIN g_users AS u
  ON rel.receiver_id = u.id
JOIN g_users AS u2
  ON rel.request_id = u2.id
WHERE u.id = 4;