当前位置: 首页 > 知识库问答 >
问题:

使用子表中的最新条目对mySQL记录进行分组

端木阳荣
2023-03-14

我有三桌办公室,电脑和维护。办公室只是办公室的列表,电脑属于办公室以及有很多维护。

我想只使用Maintain Table中的最新条目来左联接所有表。下面的代码可以工作,但它只是在维护中对最旧的条目进行分组。

SELECT `Computer`.`id`, `Computer`.`control`, `Computer`.`operator`, `Computer`.`datePurchased`, `Computer`.`type`, `Computer`.`property`, `Computer`.`printer`, `Computer`.`scanner`, `Computer`.`osx`, `Computer`.`applications`, `Computer`.`licence`, `Computer`.`isStandAlone`, `Computer`.`isInternet`, `Computer`.`isNetwork`, `Computer`.`generalStatus`, `Computer`.`ip_address`, `Computer`.`mac_address`, `Computer`.`user_id`, `Computer`.`office_id`, `Computer`.`created`, `Computer`.`modified`, `Computer`.`deleted`, `Office`.`id`, `Office`.`description`, `Office`.`main_office`, `Maintain`.`id`, `Maintain`.`dateEncoded`, `Maintain`.`findings`, `Maintain`.`checkedBy`, `Maintain`.`remarks`, `Maintain`.`computer_id`, `Maintain`.`created`, `Maintain`.`modified`, `Maintain`.`user_id` FROM `computers`.`computer` AS `Computer`

LEFT JOIN `computers`.`office` AS `Office` 
ON (`Office`.`id` = `Computer`.`office_id`)

LEFT JOIN `computers`.`maintain` AS `Maintain`
ON (`Computer`.`id` = `Maintain`.`computer_id`)

LEFT JOIN (SELECT MAX(dateEncoded) maxDate, findings FROM maintain GROUP BY computer_id) AS `P2`
ON (`Maintain`.`dateEncoded` = `p2`.`maxDate`) 

WHERE `Office`.`main_office` LIKE '%CVPH MON%'
GROUP BY `Computer`.`id` 
ORDER BY `Office`.`description` ASC

样品

OFFICE
1    AAAA
2    BBBB

COMPUTER
id   name   office_id
1    CP1    1
2    CP2    1
3    CP3    2

Maintain
id   description   date        computer_id
1     Fix         06/20/2014    1
2     Fix         06/11/2014    1
3     Fix         06/12/2014    2
4     Fix         06/15/2014    2


Result if query on computer=CP1 should be
Office     Computer_name    Maintain_desc    Date
AAA         CP1               Fix           06/20/2014   <- Latest entry in maintain

共有1个答案

慕容俭
2023-03-14

你可以这样做

SELECT `c`.`id`, 
`c`.`name`, 
`c`.`office_id` ,
`o`.`name` office_name, 
`m`.`date`,
`m`.`description`
FROM `computer` AS c
LEFT JOIN `office` AS `o` 
ON (`o`.`id` = `c`.`office_id`)
LEFT JOIN `maintain` AS m
ON (`c`.`id` = `m`.`computer_id`)
INNER JOIN 
(SELECT computer_id,MAX(`date`) maxdate 
 FROM maintain 
 GROUP BY computer_id ) t
ON(m.`date`=t.maxdate AND m.computer_id= t.computer_id)
 WHERE `c`.`name` ='CP1' ... more conditions
 类似资料:
  • 问题内容: 在下表中,如何仅根据登录列获取的 最新记录 ,而不是所有3条记录? 问题答案: 使用按ID分组的汇总。这将列出每个最新的。 要获取完整的单个记录,请对仅返回每个ID 的子查询执行。

  • 问题内容: 我有一个这样的 LoginTime 表: 我想删除的最后一条记录。用户的最后一条记录可以通过识别。 如何使用一个查询执行此操作。 问题答案: 您需要按user_id(例如WHERE user_id = 1)过滤表,然后按时间(例如ORDER BY datetime)对其进行排序,然后将查询限制为一项(例如LIMIT1),然后删除此查询的结果。最后,您将获得如下查询:

  • 如何用条件(type=“block”)对所有记录进行分组? 我已尝试:db.itr.aggregate({$match:{“UIN”:“1396599472869”}},{$project:{“VM”:1}},{$group:{_id:null,r1:{$push:“$VM”}}},{$unwind:“$R1”},{$group:{_id:null,r2:{$push:“$R1”}},{$unwi

  • 问题内容: 我想提取结果并计算每个名称中有多少被提取但没有分组… 例如我想要这样: 而不是这样: 那有意义吗? 谢谢。 问题答案:

  • 问题内容: 我正在使用的Web应用程序偶尔会为某些用户带来数据完整性问题。我想打开跟踪级别的日志记录,但是由于我们每秒要处理100个请求,因此每个日志记录都是不可能的。 log4j是否可以有条件地记录日志?换句话说,我希望仅在特定用户发出请求时才能获得跟踪日志。由于我事先不知道哪些用户会受到影响,因此我无法简单地临时对用户名进行硬编码。 编辑: 我想我需要更清楚一点。我可以轻松地在日志语句中添加条

  • 问题内容: 我正在尝试获取在请求中发送的确切JSON。这是我的代码: 但是我只在日志中看到: 考虑到删除了Retrofit 1 ()以及我们以前使用的Retrofit 1 ,我应该如何正确记录? 问题答案: 在Retrofit 2中,你应该使用HttpLoggingInterceptor。 将依赖项添加到。截至2019年10月的最新版本是: 创建一个Retrofit如下所示的对象: 如果有弃用警告