MySQL按分组,同时按列内容保留某些行
表中有重复的行。请参见第1行和第2行:MySQL按分组,同时按列内容保留某些行,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,表中有重复的行。请参见第1行和第2行: id full_name email status active 1 John Doe john@mail.com ok 1 2 John Doe john@mail.com null 1 3 Ricky Duke rick@mail.com null 1 4 Jane Doe jane@mail.com block 1
id full_name email status active
1 John Doe john@mail.com ok 1
2 John Doe john@mail.com null 1
3 Ricky Duke rick@mail.com null 1
4 Jane Doe jane@mail.com block 1
我需要选择不同的行,而不是随机选择-一个不同的行,但是具有非空的“状态”的行
我的问题是:
SELECT full_name, email
FROM `subscribers`
WHERE active = 1 AND (status = 'ok' OR status IS NULL)
GROUP BY email
该查询随机选择不同的行,而不对“状态”字段进行优先级排序
我如何优先选择“状态”不为NULL的不同行,并仅在没有“确定”状态的行存在的情况下选择具有NULL的行?您可以使用
row\u number()
:
您可以使用
行编号()
:
您可以使用执行条件排序的相关子查询进行筛选,并为
null
状态提供最低优先级:
select t.*
from mytable t
where t.id = (
select id
from mytable t1
where
t1.full_name = t.full_name
and t1.email = t.email
and t1.active = t.active
order by status is null, status
limit 1
)
这将复制定义为具有相同全名
、电子邮件
和活动
的记录。您可能希望根据您对重复项的实际定义对其进行调整
:
id | full_name | email | status | active
-: | :--------- | :------------ | :----- | :-----
1 | John Doe | john@mail.com | ok | 1
3 | Ricky Duke | rick@mail.com | null | 1
4 | Jane Doe | jane@mail.com | block | 1
id |全名|电子邮件|状态|活动
-: | :--------- | :------------ | :----- | :-----
1 |约翰·多伊|john@mail.com|好| 1
3 |里奇·杜克|rick@mail.com|空| 1
4 |简·多伊|jane@mail.com|区块| 1
您可以使用执行条件排序的相关子查询进行筛选,并为
null
状态提供最低优先级:
select t.*
from mytable t
where t.id = (
select id
from mytable t1
where
t1.full_name = t.full_name
and t1.email = t.email
and t1.active = t.active
order by status is null, status
limit 1
)
这将复制定义为具有相同全名
、电子邮件
和活动
的记录。您可能希望根据您对重复项的实际定义对其进行调整
:
id | full_name | email | status | active
-: | :--------- | :------------ | :----- | :-----
1 | John Doe | john@mail.com | ok | 1
3 | Ricky Duke | rick@mail.com | null | 1
4 | Jane Doe | jane@mail.com | block | 1
id |全名|电子邮件|状态|活动
-: | :--------- | :------------ | :----- | :-----
1 |约翰·多伊|john@mail.com|好| 1
3 |里奇·杜克|rick@mail.com|空| 1
4 |简·多伊|jane@mail.com|区块| 1
见