mysql 'ORDER BY' 加入了没有值的列
mysql 'ORDER BY' joined columns with NO Values
我将 3 个 table 连在一起,一个是 users
包含相关人员的详细信息 events
包含事件的详细信息 invites
包含有关的详细信息已发送的邀请和受邀者的回复。
因为我没有每个人的电子邮件地址,所以并不是每个人都收到电子邮件邀请。每个被邀请的人在 invites
中都有一行 Response
被记录为 Y
, N
或 U
(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
我将 3 个 table 连在一起,一个是 users
包含相关人员的详细信息 events
包含事件的详细信息 invites
包含有关的详细信息已发送的邀请和受邀者的回复。
因为我没有每个人的电子邮件地址,所以并不是每个人都收到电子邮件邀请。每个被邀请的人在 invites
中都有一行 Response
被记录为 Y
, N
或 U
(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