修改
我在最后删除了令人困惑的评论,并添加了一个额外的列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日期的记录? 结束编辑
我有一个包含列的表:
我需要一个查询,它为每个牌照返回一条记录,其最大值为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 |
答案 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 |
以下是结果的捕获: