MySQL:Max(ID)上的左联接表返回重复项

问题描述 投票:0回答:1

我正在尝试将表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 Results

这里也是带有一些测试记录的SQL的副本:https://my.pcloud.com/publink/show?code=XZFTOlkZxWPias3xTjbvnzwPBDuQ1mYTtDRX

按mobile_number分组已使此更正确(请参阅下面的答案),但仍然不正确。

如果我在设备上附加了手机号码,例如DEV0001的状态ID为10,然后将新记录插入到设备表中,状态ID为11,其中mobile_number设置为null,它将显示不是最新状态的记录10。

手机号码应再次保留,不要附加。

mysql join duplicates max id
1个回答
0
投票

感谢@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 
© www.soinside.com 2019 - 2024. All rights reserved.