Mysql 如何逐行为无结果子查询分配默认值?

Mysql 如何逐行为无结果子查询分配默认值?,mysql,Mysql,我有两个表,其中包含用户信息和用户之间的“朋友”关系。为了避免在每个用户和每个其他用户之间需要标记为“非朋友”的关系,我选择将关系表中没有关系的用户定义为非朋友 然而,现在我正试图实现一个搜索功能,以帮助用户将添加的人作为他们的朋友,我试图返回一个与搜索到的名字匹配的其他用户的列表;我还尝试输出搜索用户和结果用户之间的关系状态,并尝试在不存在任何关系时使用IFNULL设置返回值 我编写的查询对于单个用户来说效果很好,但是当子查询结果返回多个用户时,IFNULL语句不会逐行调用,而只在整个结果表为

我有两个表,其中包含用户信息和用户之间的“朋友”关系。为了避免在每个用户和每个其他用户之间需要标记为“非朋友”的关系,我选择将关系表中没有关系的用户定义为非朋友

然而,现在我正试图实现一个搜索功能,以帮助用户将添加的人作为他们的朋友,我试图返回一个与搜索到的名字匹配的其他用户的列表;我还尝试输出搜索用户和结果用户之间的关系状态,并尝试在不存在任何关系时使用
IFNULL
设置返回值

我编写的查询对于单个用户来说效果很好,但是当子查询结果返回多个用户时,
IFNULL
语句不会逐行调用,而只在整个结果表为空时调用

这是我的桌子:

user_table
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1  | John       | Doe       |
| 2  | Jane       | One       |
| 3  | Jane       | Two       |
| 4  | Jane       | Three     |
+----+------------+-----------+

relationship_table
+-----------+-------------+--------------+
| sender_id | receiver_id | relationship |
+-----------+-------------+--------------+
| 1         | 2           | friends      |
| 3         | 1           | pending      |
+-----------+-------------+--------------+
当用户johndoe执行对
“jane”
的搜索时,我试图生成以下内容

results
+----+------------+-----------+--------------+
| id | first_name | last_name | relationship |
+----+------------+-----------+--------------+
| 2  | Jane       | One       | friends      |
| 3  | Jane       | Two       | pending      |
| 4  | Jane       | Three     | not friends  |
+----+------------+-----------+--------------+
以下是我目前的查询:

SELECT user_table.id, user_table.first_name, user_table.last_name, derived_table.relationship
FROM user_table, (
    SELECT IFNULL((type), 'not friends') AS relationship
    FROM relationship_table
    WHERE sender_id IN (
        SELECT id
        FROM user_table
        WHERE first_name LIKE 'jane%'
        OR last_name LIKE 'jane%'
        AND id != '1'
    )
    AND receiver_id = '1'
    OR receiver_id IN (
        SELECT id
        FROM user_table
        WHERE first_name LIKE 'jane%'
        OR last_name LIKE 'jane%'
        AND id != '1'
    )
    AND sender_id = '1'
)derived_table
WHERE first_name LIKE 'jane%'
OR last_name LIKE 'jane%'
AND user_table.id != '1'
此查询当前正在为搜索
“jane”
返回此信息:

对我来说很明显,这是因为关系子查询的整个结果被添加到每个用户数据集中,而不是与相应的用户匹配

逻辑告诉我,使用id的加入可以解决这个问题,尽管在哪个用户发送了友谊请求之间不存在一致性,因此没有一致的id加入。。。我不知道如何正确地加入他们


另外,我相信可能有一种方法可以更好地检查你是发送者或接收者的关系,因此,如果有任何帮助,我们也将不胜感激。

在所有Janes和John所有朋友的表格之间留下连接

所有珍妮:

**Query**
SELECT user_table.id, user_table.first_name, user_table.last_name
FROM user_table
WHERE first_name LIKE 'jane%'
OR last_name LIKE 'jane%'
AND id != '1'

**Results**
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  2 | Jane       | One       |
|  3 | Jane       | Two       |
|  4 | Jane       | Three     |
+----+------------+-----------+
约翰的朋友们:

**Query**
(
    SELECT relationship_table.sender_id AS id, relationship
    FROM relationship_table
    WHERE receiver_id = '1'
)
UNION
(
    SELECT relationship_table.receiver_id AS id, relationship
    FROM relationship_table
    WHERE sender_id = '1'
)

**Results**
+----+--------------+
| id | relationship |
+----+--------------+
|  2 | friends      |
|  3 | pending      |
+----+--------------+
然后合并:

**Query**
SELECT searched_users.id, searched_users.first_name, searched_users.last_name, IFNULL(users_friends.relationship, 'not friends') AS relationship
FROM (
    SELECT user_table.id, user_table.first_name, user_table.last_name
    FROM user_table
    WHERE first_name LIKE 'jane%'
    OR last_name LIKE 'jane%'
    AND id != '1'
)searched_users
LEFT JOIN (
    (
        SELECT relationship_table.sender_id AS id, relationship
        FROM relationship_table
        WHERE receiver_id = '1'
    )
    UNION
    (
        SELECT relationship_table.receiver_id AS id, relationship
        FROM relationship_table
        WHERE sender_id = '1'
    )
)users_friends
ON searched_users.id = users_friends.id

**Results**
+----+------------+-----------+--------------+
| id | first_name | last_name | relationship |
+----+------------+-----------+--------------+
| 2  | Jane       | One       | friends      |
| 3  | Jane       | Two       | pending      |
| 4  | Jane       | Three     | not friends  |
+----+------------+-----------+--------------+

如果在没有匹配项的情况下要获得
NULL
,则需要使用
LEFT JOIN
。@Barmar如果您想将此作为解决方案发布,我会给您正确的答案。谢谢你的帮助。看起来你自己解决了。将其作为答案发布,而不是作为问题的更新。
**Query**
SELECT searched_users.id, searched_users.first_name, searched_users.last_name, IFNULL(users_friends.relationship, 'not friends') AS relationship
FROM (
    SELECT user_table.id, user_table.first_name, user_table.last_name
    FROM user_table
    WHERE first_name LIKE 'jane%'
    OR last_name LIKE 'jane%'
    AND id != '1'
)searched_users
LEFT JOIN (
    (
        SELECT relationship_table.sender_id AS id, relationship
        FROM relationship_table
        WHERE receiver_id = '1'
    )
    UNION
    (
        SELECT relationship_table.receiver_id AS id, relationship
        FROM relationship_table
        WHERE sender_id = '1'
    )
)users_friends
ON searched_users.id = users_friends.id

**Results**
+----+------------+-----------+--------------+
| id | first_name | last_name | relationship |
+----+------------+-----------+--------------+
| 2  | Jane       | One       | friends      |
| 3  | Jane       | Two       | pending      |
| 4  | Jane       | Three     | not friends  |
+----+------------+-----------+--------------+