MySQL UNION SELECT在几列上找到MAX的MAX

时间:2014-11-05 14:19:08

标签: mysql select max union

这是我previous question的延续。

假设我们有三张桌子。主表和两个id表。

+-----+-----+--------------------------------------+
| cid | pid | date1      | date2      | date3      |
+-----+-----+--------------------------------------+
|  1  |  2  | NULL       | 2014-03-24 | 2014-03-24 | 
|  3  |  1  | 2014-06-13 | NULL       | NULL       | 
|  4  |  3  | NULL       | 2014-09-14 | NULL       | 
|  2  |  1  | NULL       | NULL       | 2014-08-15 | 
|  4  |  3  | 2014-01-10 | NULL       | NULL       | 
|  1  |  4  | 2014-02-15 | NULL       | NULL       | 
|  4  |  2  | NULL       | 2014-01-06 | 2014-01-12 | 
+-----+-----+------------+------------+------------+

+----+----------+     +----+--------+
| id | city     |     | id | person |
+----+----------+     +----+--------+
| 1  | 'Dallas' |     | 1  | 'John' |
| 2  | 'Berlin' |     | 2  | 'Jack' |
| 3  | 'Topeka' |     | 3  | 'Doug' |
| 4  | 'London' |     | 4  | 'Pete' |
+----+----------+     +----+--------+

好的,现在我想在结果中选择每个城市一行。该行必须包含城市,此城市的最大日期(date1,date2,date3)以及属于最多三个日期的人员。 结果:

+--------+--------+--------------------------------------+
| city   | person | date1      | date2      | date3      |
+--------+--------+--------------------------------------+
| Dallas | Jack   | 2014-02-15 | 2014-03-24 | 2014-03-24 | 
| Berlin | John   | NULL       | NULL       | 2014-08-15 | 
| Topeka | John   | 2014-06-13 | NULL       | NULL       | 
| London | Doug   | 2014-01-10 | 2014-09-14 | 2014-01-12 | 
+--------+--------+------------+------------+------------+
是的......我认为这不会那么困难。

see the fiddle

1 个答案:

答案 0 :(得分:1)

我认为这可能有用。

select c.city, p.person, y.date1, y.date2, y.date3
  from (select x.cid, x.date1, x.date2, x.date3, greatest(ifnull(x.date1, '0000-01-01'), ifnull(x.date2, '0000-01-01'), ifnull(x.date3, '0000-01-01')) as maxdate
          from (select cid, max(date1) as date1, max(date2) as date2, max(date3) as date3
                  from main
                 group by cid) as x)
              as y
join main m 
  on m.cid = y.cid and 
  (m.date1 = y.maxdate or m.date2 = y.maxdate or m.date3 = y.maxdate)
join city c 
  on y.cid = c.id
join person p 
  on m.pid = p.id

首先创建' x'这是一个包含每个城市的最大日期的表格。然后它创造了' y'它增加了3个日期中最高的。然后它与主表连接以查找具有最高日期的城市的行。然后它加入城市和人员表来获取名称而不是ID。