我正在尝试将表mobile_services与一个名为devices的表连接起来,以便可以显示移动服务的列表,该列表显示了当前连接到该服务的设备。
我想基于设备的max(status_id)加入设备,以便仅检索当前记录而不是历史记录。
这是数据库的结构:
Devices:
status_id (Int: 11, Auto Increment)
status(enum: 'spare','assigned','destroyed','repair','lost','damaged' )
barcode(Varchar: 40)
mobile_number(int: 10, Foreign Key)
Mobile Services:
mobile_number(int: 10)
通过下面的SQL查询,我正在检索重复的记录。我只想返回具有最高status_id的条形码。在这种情况下,我只想在查询结果中检索状态ID 15,而不是14。
SELECT `mobile_services`.`mobile_number`,
`barcode`,
`status_id`,
`status`
FROM `mobile_services`
LEFT JOIN (SELECT status_id,
status,
barcode,
mobile_number
FROM devices
WHERE status_id IN (SELECT Max(status_id) AS id
FROM devices
GROUP BY barcode)) AS D
ON D.mobile_number = mobile_services.mobile_number
这里也是带有一些测试记录的SQL的副本:https://my.pcloud.com/publink/show?code=XZFTOlkZxWPias3xTjbvnzwPBDuQ1mYTtDRX
按mobile_number分组已使此更正确(请参阅下面的答案),但仍然不正确。
如果我在设备上附加了手机号码,例如DEV0001的状态ID为10,然后将新记录插入到设备表中,状态ID为11,其中mobile_number设置为null,它将显示不是最新状态的记录10。
手机号码应再次保留,不要附加。
感谢@DRapp的帮助。分组依据应指的是mobile_number,而不是条形码。
下面的完整查询:
SELECT `mobile_services`.`mobile_number`,
`barcode`,
`status_id`,
`status`
FROM `mobile_services`
LEFT JOIN (SELECT status_id,
status,
barcode,
mobile_number
FROM devices
WHERE status_id IN (SELECT Max(status_id) AS id
FROM devices
GROUP BY mobile_number)) AS D
ON D.mobile_number = mobile_services.mobile_number