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 |
+----+------------+-----------+--------------+