首页 > 解决方案 > 使用 LEFT JOIN 进行 MySql ENUM 排序

问题描述

我有以下模型:

有客户(Clients表),每个客户有一个或多个地址(Addresses表)。
每个地址可能有一个电话号码,固定电话或手机(PhoneNumbers表): 在此处输入图像描述

不幸的是,我无法更改数据库设计,它是随项目提供给我的。

我需要执行的任务是列出所有客户及其地址,并为每个地址列出相应的电话号码(如果存在)。

问题是我需要根据电话号码类型对结果进行排序:

我得到了以下查询:

SELECT Clients.last_name, Clients.first_name, Addresses.city, PhoneNumbers.line_type, 
PhoneNumbers.line_number
FROM Clients 
INNER JOIN Addresses ON Addresses.client_id = Clients.id
LEFT JOIN PhoneNumbers ON PhoneNumbers.address_id = Addresses.id
ORDER BY Clients.last_name, Clients.first_name, FIELD(PhoneNumbers.line_type, 'landline','mobile');

问题是没有任何数字的地址首先列出:

+-----------+------------+-----------+-----------+-------------+
| last_name | first_name | city      | line_type | line_number |
+-----------+------------+-----------+-----------+-------------+
| Gracia    | Maria      | Madrid    | NULL      | NULL        |
| Gracia    | Maria      | Madrid    | landline  | 911111111   |
| Gracia    | Maria      | Madrid    | mobile    | 666111111   |
+-----------+------------+-----------+-----------+-------------+

知道如何将这些条目列在每个客户的末尾吗?

标签: mysql

解决方案


FIELD(NULL, {values list})总是返回 NULL。

NULL 始终是 ORDER BY 中的最小值。

使用ORDER BY ..., PhoneNumbers.line_type IS NULL, PhoneNumbers.line_type = 'mobile'.

PhoneNumbers.line_type IS NULL将具有 NULL 的行放在最后。

PhoneNumbers.line_type = 'mobile'将值为 的行放在'mobile'另一个值之后(但在上一个排序步骤中最后移动的 NULL 值之前)。


推荐阅读