我有两个表,这些表保存关于我在查询中加入的绘图的信息。第一个表格包含图纸的唯一编号、标题和绘制对象。第二个表格包含修订和修改图纸的日期。
表1
|dwg_id|project_no|sws_dwg_no|dwg_title|dwg_by|
|1 |153 |153-100 |Pipe... |JS |
表2
|dwg_id|dwg_rev|dwg_date |rev_id|
|1 |A |2015-07-15 11:00:00 |1 |
|1 |B |2015-07-23 12:00:00 |2 |
|1 |C |2015-08-06 10:00:00 |3 |
我希望加入这两个表,并且只显示最近修改的绘图更改。
这是我当前的查询。
SELECT
`drawings`.`dwg_id`,
`project_no`,
`sws_dwg_no`,
`client_dwg_no`,
`dwg_title`,
`dwg_by`,
`dwg_rev`.`dwg_rev`,
`dwg_rev`.`dwg_date`,
MAX(`dwg_rev`.`dwg_rev`) AS dwg_rev
FROM
(`drawings`)
JOIN `dwg_rev` ON `drawings`.`dwg_id` = `dwg_rev`.`dwg_id`
WHERE
`project_no` = '153'
GROUP BY
`sws_dwg_no`,
`dwg_rev`.`dwg_rev`
ORDER BY
`dwg_rev`.`dwg_date` ASC,
`dwg_rev`.`dwg_rev` ASC
此查询返回的结果不包含最新的修订编号,或者返回每个绘图的所有修订。
发布于 2015-08-06 15:27:26
您可以使用以下查询:
SELECT d.*, dr.*
FROM drawings AS d
INNER JOIN (
SELECT dwg_id, MAX(rev_id) AS maxRevId
FROM dwg_rev
GROUP BY dwg_id
) AS t ON d.dwg_id = t.dwg_id
INNER JOIN dwg_rev AS dr ON t.dwg_id = dr.dwg_id AND t.maxRevId = dr.rev_id
WHERE project_no = 153
上面查询的关键点是使用一个派生表,该表返回最新的修订版,即MAX(rev_id)
,每个dwg_id
。使用派生表上的INNER JOIN
,您将完全从dwg_rev
表中返回此行。
如果每个dwg_id
都有多个project_no
,那么使用上述内容是必要的。在本例中,上面的查询将为project_no = 153
每次绘图获取最新的修订版。
Demo here
发布于 2015-08-06 15:03:31
如果您需要最新的修订,您应该订购下面的DESC检查代码。
而且,如果填充了dwg_rev.
rev_id` DESC,则只能通过rev_id订购。
dwg_rev< dwg_rev.
dwg_date, MAX(
dwg_rev.
dwg_rev) AS dwg_rev FROM (
drawings) JOIN
dwg_revON
drawings.
dwg_id=
dwg_rev.
dwg_id >dwg_rev>d20d20d21 sws_dwg_no,
dwg_rev.
dwg_rev ORDER BY
dwg_rev.
dwg_dateDESC,
dwg_rev.
dwg_revDESC LIMIT 1;
发布于 2015-08-06 15:08:52
有时候,MAX
并不是最好的方法,相反,使用LIMIT
试试如下:
SELECT
`drawings`.`dwg_id`,
`project_no`,
`sws_dwg_no`,
`client_dwg_no`,
`dwg_title`,
`dwg_by`,
`dwg_rev`.`dwg_rev`,
`dwg_rev`.`dwg_date`,
`dwg_rev`.`dwg_rev` AS dwg_rev
FROM
(`drawings`)
JOIN `dwg_rev` ON `drawings`.`dwg_id` = `dwg_rev`.`dwg_id`
WHERE
`project_no` = '153'
GROUP BY
`sws_dwg_no`,
`dwg_rev`.`dwg_rev`
ORDER BY
`dwg_rev`.`dwg_date` DESC,
`dwg_rev`.`dwg_rev` DESC
LIMIT 1;
https://stackoverflow.com/questions/31859037
复制相似问题