可能 select 只有 1 行用户名,即使包含用户名的多行是唯一的

Possible to select only 1 row for usernames, even though multiple rows which include usernames are unique

我正在尝试 select 所有拥有至少一个 windows 操作系统的用户名。有些用户有很多 windows 个操作系统,但我真的只需要知道他们是否至少有一个。

我知道 DISTINCT 可以过滤掉重复项,但问题是这些行是唯一的,如果它们有多个 OS。例如:

JohnDoe windows 10;
JohnDoe windows 97;
JohnDoe windows 7;
JennyDoe windows 10;

在这种情况下,JohnDoe 将被 selected 3 次,因为他有 3 个独特的操作系统。

有没有办法从本质上说,如果出现此用户名的实例,只有 select 一行?

我假设 usernameos - 存储在两个单独的列中。

让我们用一些数据创建 table。

CREATE TABLE IF NOT EXISTS `user_os` ( username varchar(100), os varchar(100));

INSERT INTO user_os values 
('JohnDoe', 'windows 10'),
('JohnDoe', 'windows 97'),
('JohnDoe', 'windows 7'),
('JennyDoe', 'windows 10'),
('Jessica', 'Ubuntu');

现在我们可以在 os 列中查找 'windows' 字符串并对其进行分组。您将获得 1 - 对于至少有 1 个 windows 的用户 os 或 0 - 对于其他人。

SELECT username, instr(os, 'windows') AS at_least_1_windows
FROM user_os
GROUP BY 1,2;

结果:

username  at_least_1_windows
--------  ------------------
JennyDoe  1
Jessica   0
JohnDoe   1

在 sql 中,您可以使用 Tsql row_number 代码,因此当您只需要 select 时,仅 select 行号为 1 的行许多重复行之间的一行最好使用此代码,因为不同的速度很慢

CREATE TABLE table_name (
    usernam varchar(100),
    os varchar(100),
  

)

insert into table_name
values('john','windows10')

insert into table_name
values('john','windows7')

 insert into table_name
values('david','windows7')

select 
usernam,

    row_number() over (partition by [usernam] order by os  desc)rownum
   
from 

   table_name t
   

所以结果是

so if you add this query select only one record 

select tbl.usernam from (
select 
usernam,

   row_number() over (partition by [usernam] order by os  desc) rownum
   
from 

   table_name 
   ) tbl
   
   where rownum=1
   

所以结果是

您还可以显示其他字段

select tbl.usernam,tbl.os from (
    select 
    usernam,
os,
       row_number() over (partition by [usernam] order by os  desc) rownum
       
    from 

       table_name 
       ) tbl
       
       where rownum=1
       
       

结果是:

据此你的查询速度很好

最简单的方法是使用DISTINCT:

select distinct username
  from your_table
  where operating_system like '%windows%'

根据问题中显示的数据,这将 return

JohnDoe
JennyDoe

db<>fiddle here