我无法理解条件连接的行为。这是一个注释表,其中有两种类型的用户。如果user_type_id = 1,则数据应来自admins表;如果user_type_id = 2,则数据应来自users表。
所以我写了如下查询:
select a.name as admin_name, concat(u.first_name, ' ', u.last_name) as user_name, ptc.*
from project_task_comments ptc
left join admins a on a.id= ptc.user_id and ptc.user_type_id=1
left join users u on u.id=ptc.user_id and ptc.user_type_id=2
and ptc.id=1
结果如下:
我的问题是为什么(在结果集中)第3行和第5行的admin_name和user_name为null?我想念什么吗?
管理员表:
+----+----------------+
| id | name |
+----+----------------+
| 1 | ADMIN John Doe |
+----+----------------+
用户表:
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
| 1 | User | Alice |
+----+------------+-----------+
答案 0 :(得分:2)
根据您的数据,有3条记录“ ptc.user_type_id = 2”,1。ptc.id = 1 2. ptc.id = 3 3. ptc.id = 5在查询中,您已经提到放置属于第一个实例的记录(即ptc.id = 1)。 因此,如果要全部使用三个,则需要使用以下查询。
SELECT a.name as admin_name, concat(u.first_name, ' ', u.last_name) as user_name, ptc.*
FROM project_task_comments ptc
left join admins a on a.id= ptc.user_id and ptc.user_type_id=1
left join users u on u.id=ptc.user_id and ptc.user_type_id=2
答案 1 :(得分:1)
通常来说,您需要选择主表(例如用户),并对相关表进行两次条件连接。
这通常意味着在内部,您的查询将以以下方式返回行数组: 评论。* |用户。* |管理员。*
对于某些行,用户列将具有空列,对于其他行,对于管理列,将具有空列。最后,您可能需要第一个非null值。
因此,如果您有一行,例如:
import "math";
(function() {
"use strict";
this.m = new math();
console.log(m.add(1, 6));
})();
最后,您想转义comment.id | comment.text | user.username | admin.username
123 | "Example text" | null | john2019
并仅返回null
。
MySQL函数COALESCE()可为您提供帮助:
john2019
它将从提供的列中选择第一列非空,因此所选行将为:
SELECT comment.id, comment.text, COALESCE(user.username, admin.username)
我希望您不会对此感到困惑。如果您需要进一步说明,请在下面的评论中告诉我。