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

时间:2016-05-11 08:07:23

标签: 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   |

我的预期:

  | name  | license_plate | pl_id | start_date |
  | aaron | AA-AA-22      |     4 | 2016-1-1   |

所以不知何故车牌号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       |

查询应返回:

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

4 个答案:

答案 0 :(得分: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;

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

在您的数据集上进行测试。

答案 1 :(得分:4)

我很困惑,从你的例子中你似乎想要优先于null优先于任何实际日期 - 我只是不知道这与多个条件的群体有什么关系...... 也许这answer可以帮到你吗?

SELECT
    `name`,
    license_plate,
    CASE
        WHEN MAX(start_date IS NULL) = 0 THEN MAX(start_date)
    END AS start_date
FROM
    plates
GROUP BY
    `name`,
    license_plate

输出:

+-------+---------------+------------+
| name  | license_plate | start_date |
+-------+---------------+------------+
| aaron | AA-AA-11      | NULL       |
| aaron | AA-AA-22      | 2016-01-01 |
| bill  | BB-BB-11      | NULL       |
| bill  | BB-BB-22      | 2015-01-01 |
| clark | CC-CC-11      | 2016-01-01 |
| dave  | DD-DD-11      | 2016-01-01 |
| eddy  | EE-EE-11      | NULL       |
+-------+---------------+------------+
7 rows in set

答案 2 :(得分:1)

您需要2个查询,一个NULL值,另一个MAX(start_date)

SELECT name, license_plate, MAX(start_date) FROM test.tab
group by name, license_plate having count(start_date) = count(name)

union 
select name, license_plate, start_date From test.tab
Where start_date is null

在此条件count(start_date) = count(name)中,您会发现null值为null的记录,因为在count句中未计算select值。

另一个start_date = null会返回where的记录。

如果您的数据库有多个记录的null值为license_plate

,则可以向第二个查询添加 $query = "INSERT INTO $DatabaseName .`scores` (`id`, `name`, `score` , `score2`) VALUES (NULL, '$name', '$score', '$score2');"; ON DUPLICATE KEY UPDATE name='$name', score='$score', score2='$score2', 条件

答案 3 :(得分:0)

您可以使用分组依据

SELECT  distinct * FROM [tablename] where start_date is null or start_date group by 
license_number order by name,start_date

" start_date为空"如果license_plate组中的start_date和"或start_date"中有空值,则首先显示是为了显示非空的其他日期。

它会产生相同的结果:

| name  | license_plate | start_date |
| aaron | AA-AA-11      | null       | 
| aaron | AA-AA-22      | 2016-1-1   |
| bill  | BB-BB-11      | null       |
| bill  | BB-BB-22      | 2015-1-1   |
| clark | CC-CC-11      | 2016-1-1   |
| dave  | DD-DD-11      | 2016-1-1   |
| eddy  | EE-EE-11      | null       |

以下是结果的捕获:

enter image description here Here is a capture of the result