mysql 'ORDER BY' 加入了没有值的列

mysql 'ORDER BY' joined columns with NO Values

我将 3 个 table 连在一起,一个是 users 包含相关人员的详细信息 events 包含事件的详细信息 invites 包含有关的详细信息已发送的邀请和受邀者的回复。

因为我没有每个人的电子邮件地址,所以并不是每个人都收到电子邮件邀请。每个被邀请的人在 invites 中都有一行 Response 被记录为 Y, NU (Yes, No, Unresponded).

联合 table 中的 Response 列可以有 4 个结果,Y, U, NUll, N,

我想使用 ORDER BY 对 ORDER 中的 table 进行排序,但它不起作用。我对 mysql 还是很陌生,但我猜这是因为 WHERE 子句在完成 JOIN 之前过滤掉了不相关的结果,并且NULL 值尚不存在。

SELECT users.id, name, email, eventdate, response
FROM users 
LEFT JOIN events 
ON users.teamID=events.teamID 
LEFT JOIN invites 
ON events.eventID=invites.eventID
AND users.id=invites.id
WHERE users.teamID=:teamID
ORDER BY 
eventdate DESC,
response='Y' DESC,
response='U' DESC,
response IS NULL DESC,
response='N' DESC



// users
+----+------+-------+--------+
| id | name | email | teamID |
+----+------+-------+--------+
|  1 | SM   | NULL  |      1 |
|  2 | CK   | NULL  |      1 |
|  3 | JG   | NULL  |      1 |
|  4 | DM   | NULL  |      1 |
+----+------+-------+--------+

// events
+---------+--------+------------+
| eventID | teamID | eventdate  |
+---------+--------+------------+
|       1 |      1 | 2017-09-30 |
+---------+--------+------------+

// invites
+---------+----+----------+
| eventID | id | response |
+---------+----+----------+
|       1 |  1 | Y        |
|       1 |  2 | N        |
|       1 |  3 | U        |
+---------+----+----------+

我要实现的是这个?

+----+------+-------+------------+----------+
| id | name | email | eventdate  | response |
+----+------+-------+------------+----------+
|  1 | SM   | NULL  | 2017-09-30 | Y        |
|  3 | JG   | NULL  | 2017-09-30 | U        |
|  4 | DM   | NULL  | 2017-09-30 | NULL     |
|  2 | CK   | NULL  | 2017-09-30 | N        |
+----+------+-------+------------+----------+

您是否希望通过字段

使用订单
  SELECT id, name, email, eventdate, response
  FROM users 
  LEFT JOIN events  ON users.teamID=events.teamID 
  LEFT JOIN invites ON events.eventID=invites.eventID  AND users.id=invites.id
  WHERE TeamID=:TeamID
  ORDER BY eventdate DESC, field( response, 'Y', 'U', 'N') DESC

或者如果您需要更直接的管理,您可以使用 case when

  SELECT id, name, email, eventdate, response
  FROM users 
  LEFT JOIN events  ON users.teamID=events.teamID 
  LEFT JOIN invites ON events.eventID=invites.eventID  AND users.id=invites.id
  WHERE TeamID=:TeamID

  ORDER BY eventdate DESC, case when response =  'Y' then  100 
                                when response =  'U'  then 50
                                when response is null then 20
                                when response =  'N' then 10
                                else 0 end   DESC

在结果字段中创建一个字段 order_by

SELECT users.id, name, email, eventdate, response, 
   CASE response
     WHEN 'Y' THEN 1
     WHEN 'U' THEN 2
     WHEN 'N' THEN 4
     ELSE 3
   END CASE as order_by
FROM users 
LEFT JOIN events 
ON users.teamID=events.teamID 
LEFT JOIN invites 
ON events.eventID=invites.eventID
AND users.id=invites.id
WHERE users.teamID=:teamID
ORDER BY 
eventdate DESC,
order_by ASC