mysql加入条件行为

时间:2019-03-11 13:09:23

标签: mysql

我无法理解条件连接的行为。这是一个注释表,其中有两种类型的用户。如果user_type_id = 1,则数据应来自admins表;如果user_type_id = 2,则数据应来自users表。

enter image description here

所以我写了如下查询:

 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

结果如下:

enter image description here

我的问题是为什么(在结果集中)第3行和第5行的admin_name和user_name为null?我想念什么吗?

管理员表:

+----+----------------+
| id | name           |
+----+----------------+
|  1 | ADMIN John Doe |
+----+----------------+

用户表:

+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | User       | Alice     |
+----+------------+-----------+

2 个答案:

答案 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)

我希望您不会对此感到困惑。如果您需要进一步说明,请在下面的评论中告诉我。