SQL:获取具有最高ID的行,但如果填充了特定列,则获取该行

时间:2015-12-08 13:57:08

标签: mysql sql

我有一张名为代金券的桌子,里面有很多优惠券代码。这是表格的样子,带有一些虚拟数据。

+-------+---------+-------------+------------+------------+
| gs_id |  code   |   domain    |   start    |    ende    |
+-------+---------+-------------+------------+------------+
|  1    | EXAMPLE | example.com | 1288263600 | 1291330740 |
|  2    | NULL    | example.com | 1288604942 | 1293750000 |
|  3    | ABC123  | second.com  | 1288604952 | 1298847600 |
|  4    | 456XYZ  | second.com  | 0          | 1288303200 |
+-------+---------+-------------+------------+------------+

现在我需要一个返回我的SQL语句:

1)每个域只有一个 id 2)如果每个有多个条目,它应该返回 id

的最高行

已经在使用该查询:

SELECT MAX(gs_id) AS id,domain FROM vouchers WHERE start >= 0 AND start <= 1288263600 AND (ende = 0  || ende > 1418046119) GROUP BY domain 

但我有一个对我很重要的例外:

如果一个有多个条目,并且id最高的条目的代码列为空,并且该域中还有一个非空的凭证列代码它应该返回该行..如果有多行非空代码列,它应该返回具有最高gs_id的行

在我的示例中,即期望返回这些行:

+----+---------+-------------+------------+------------+
| id |  code   |   domain    |   start    |    ende    |
+----+---------+-------------+------------+------------+
|  1 | EXAMPLE | example.com | 1288263600 | 1291330740 | because of code,
|  4 | 456XYZ  | second.com  | 1288604958 | 1288303200 | because of MAX(id)
+----+---------+-------------+------------+------------+

不应该选择第2行,因为它有空列代码,并且来自同一 domein 的另一个条目具有非空代码。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

过滤出派生表中的null代码行,并获取max gs_id。然后join将结果发送到主表。

select t.id, t.domain, v.code, v.start, v.ende
from (SELECT MAX(gs_id) AS id, domain 
      FROM vouchers 
      WHERE start >= 0 AND start <= 1288263600 AND (ende = 0  or ende > 1418046119) 
      and code is not null
      GROUP BY domain) t
join vouchers v on t.domain = v.domain and t.id = v.gs_id