mysql - 使用 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 |
+-----------+------------+-----------+-----------+-------------+
知道如何将这些条目列在每个客户的末尾吗?
解决方案
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 值之前)。
推荐阅读
- python - 如何在 Python 中的工具栏菜单后显示选项卡小部件?
- css - @keyframes 动画未运行
- python-3.x - 使用scrapy脚本时遇到问题(选择链接)
- kdtree - 多边形搜索
- cmake - 安装问题:Cmake 错误:include 找不到加载文件:yarpl-exports.cmake
- amazon-web-services - 关于 EC2 的 AWS 问题在 3:23 小时内关闭,您将在 0、3、4、3:23 或 3.24 小时内收取多少费用?
- angular-material - Angular 8 中的材质图标无法正确显示
- python - 如何手动验证用户
- python-3.x - Windows PySpark 2.4.4 Standalone 无法设置 log4j.properties
- javascript - 尝试让机器人为所有成员添加角色,然后在说出一些文字后将其删除