MySQL UNION SELECT 在几列上查找 MAX 中的 MAX

标签 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' |
+----+----------+     +----+--------+

好的,现在我想进行选择以在结果中获取每个城市一行。该行必须包含城市、该城市每个日期的最大值(日期1、日期2、日期3)以及属于三个最大值日期中的最大值的人员。 结果:

+--------+--------+--------------------------------------+
| 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

最佳答案

我认为这可能有效。

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。

关于MySQL UNION SELECT 在几列上查找 MAX 中的 MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26759441/

相关文章:

mysql - 将一个 MySQL 表的 ID 名称连接到另一表中的 ID

php - 如何将两个 mysql 表组织成一个大的多维数组?

json - 如何获取大型 json 文件中日期字段的最大值?

python - 计算python中每n行数据帧的最大值/最小值

r - R中多行取一列的最大值

mysql - Node 第二个 mysql 查询未运行

php - mysql_real_escape_string() 是否足以用于 MySQL REGEXP?

mysql - SQL 内连接问题

mysql - 将多个查询与一个标准列组合

php - 使用带有逗号分隔 ID 的字符串的 SQL 选择命令