这是我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 |
+--------+--------+------------+------------+------------+
是的......我认为这不会那么困难。
答案 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。