我有一张名为代金券的桌子,里面有很多优惠券代码。这是表格的样子,带有一些虚拟数据。
+-------+---------+-------------+------------+------------+
| 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 的另一个条目具有非空代码。
最好的方法是什么?
答案 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