MySQL查询使用具有多个条件的组

Edv*_*art 0 mysql group-by multiple-conditions

编辑: 我在最后删除了令人困惑的评论,并添加了一个额外的列pl_id我认为无关紧要(由于我明显缺乏对group by工作的理解).在尝试发布的建议时,我遇到了导致MAX/Group By导致的问题

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-22      |     3 | 2016-1-1   |
Run Code Online (Sandbox Code Playgroud)

我期望的地方:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |
Run Code Online (Sandbox Code Playgroud)

因此,不知何故,车牌号AA-AA-22的最大日期,即2016-1-1,出现在pl_id = 3的记录中,为什么结果会返回带有pl_id 4日期的记录? 结束编辑

我有一个列表:

  • 名称
  • license_plate
  • 开始日期

我需要一个查询,它为每个牌照返回一条记录,其最大值为start_date或start_date为空.但是空的start_date应该优先于最大的start_date.

每个牌照保证最多有一个条目,start_date = null,但可以有多个条目,有效的'start_date'-s.

例如,在下表中执行时:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-11      |     1 | 2015-1-1   |
  | aaron | AA-AA-11      |     2 | null       |
  | aaron | AA-AA-22      |     3 | 2015-1-1   |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |
  | bill  | BB-BB-11      |     5 | 2015-1-1   |
  | bill  | BB-BB-11      |     6 | null       |
  | bill  | BB-BB-22      |     7 | 2015-1-1   |
  | clark | CC-CC-11      |     8 | 2015-1-1   |
  | clark | CC-CC-11      |     9 | 2016-1-1   |
  | dave  | DD-DD-11      |    10 | 2014-1-1   |
  | dave  | DD-DD-11      |    11 | 2015-1-1   |
  | dave  | DD-DD-11      |    12 | 2016-1-1   |
  | eddy  | EE-EE-11      |    13 | null       |
Run Code Online (Sandbox Code Playgroud)

查询应该返回:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-11      |     2 | null       |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |
  | bill  | BB-BB-11      |     6 | null       |
  | bill  | BB-BB-22      |     7 | 2015-1-1   |
  | clark | CC-CC-11      |     9 | 2016-1-1   |
  | dave  | DD-DD-11      |    12 | 2016-1-1   |
  | eddy  | EE-EE-11      |    13 | null       |
Run Code Online (Sandbox Code Playgroud)

小智 5

SELECT name, license_plate, IF(max(IF(start_date IS NULL, '2099-01-01',  start_date)) = '2099-01-01', null, max(start_date)) 
FROM table
GROUP BY name, license_plate;
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以将'2099-01-01'更改为更大的数字.

在您的数据集上测试.