Sqlite 基于两个表中的公共条件进行查询,并根据出现次数进行排序

Sqlite 基于两个表中的公共条件进行查询,并根据出现次数进行排序,sqlite,join,intersect,Sqlite,Join,Intersect,我需要对每个表运行查询 乌瑟拉 用户B 我使用以下查询对两个表中找到的名称(相交)进行grep,并根据找到的出现次数进行排序: select id, name, title, count(*) from ( select id, name, title, 'A' as source from userA union all select id, name, title, 'B' from userB ) group by id, name having count(di

我需要对每个表运行查询

乌瑟拉

用户B

我使用以下查询对两个表中找到的名称(相交)进行grep,并根据找到的出现次数进行排序:

select id, name, title, count(*)
from (
    select id, name, title, 'A' as source from userA
    union all
    select id, name, title, 'B' from userB
) 
group by id, name
having count(distinct source) = 2;
上述查询的输出:

id          name         title        count(*)
----------  ----------   --------     --------
1           john         engineer     3
3           laura        manager      4
4           dave         engineer     2
现在,我试图找出如何构造一个查询来只显示每个标题类别的最大计数,因此在上面的示例中,工程师类别中应该只显示john,因为他在该类别中拥有最多计数。 基本上,我想展示以下输出:

id          name         title        count(*)
----------  ----------   --------     --------
1           john         engineer     3
3           laura        manager      4
有谁能帮忙做这件事吗

谢谢

试试这个:

创建一个组合两个表中用户的
视图

CREATE VIEW userA_B as
  select *, 'A' as source from userA
  union all
  select *, 'B' as source from userB;
CREATE VIEW user_in_both_A_B as
  select id, name, title, count(*) as total_appearance
  from userA_B
  group by id, name, title
  having count(distinct source) = 2;
此视图中的数据

select * from userA_B;

id          name        title       source    
----------  ----------  ----------  ----------
1           john        engineer    A         
1           john        engineer    A         
2           mike        designer    A         
3           laura       manager     A         
4           dave        engineer    A         
1           john        engineer    B         
3           laura       manager     B         
3           laura       manager     B         
3           laura       manager     B         
5           peter       sales       B         
4           dave        engineer    B
select * from user_in_both_A_B;

id          name        title       total_appearance
----------  ----------  ----------  ----------------
1           john        engineer    3               
3           laura       manager     4               
4           dave        engineer    2
select * from title_appearing_most;

title       max_total_appearance
----------  --------------------
engineer    3                   
manager     4
创建一个
视图
,仅显示出现在两个表中的用户

CREATE VIEW userA_B as
  select *, 'A' as source from userA
  union all
  select *, 'B' as source from userB;
CREATE VIEW user_in_both_A_B as
  select id, name, title, count(*) as total_appearance
  from userA_B
  group by id, name, title
  having count(distinct source) = 2;
此视图中的数据

select * from userA_B;

id          name        title       source    
----------  ----------  ----------  ----------
1           john        engineer    A         
1           john        engineer    A         
2           mike        designer    A         
3           laura       manager     A         
4           dave        engineer    A         
1           john        engineer    B         
3           laura       manager     B         
3           laura       manager     B         
3           laura       manager     B         
5           peter       sales       B         
4           dave        engineer    B
select * from user_in_both_A_B;

id          name        title       total_appearance
----------  ----------  ----------  ----------------
1           john        engineer    3               
3           laura       manager     4               
4           dave        engineer    2
select * from title_appearing_most;

title       max_total_appearance
----------  --------------------
engineer    3                   
manager     4
创建一个
视图
,向您显示最常出现的标题

CREATE VIEW title_appearing_most as
  select title, max(total_appearance) as max_total_appearance
  from user_in_both_A_B
  group by title
此视图中的数据

select * from userA_B;

id          name        title       source    
----------  ----------  ----------  ----------
1           john        engineer    A         
1           john        engineer    A         
2           mike        designer    A         
3           laura       manager     A         
4           dave        engineer    A         
1           john        engineer    B         
3           laura       manager     B         
3           laura       manager     B         
3           laura       manager     B         
5           peter       sales       B         
4           dave        engineer    B
select * from user_in_both_A_B;

id          name        title       total_appearance
----------  ----------  ----------  ----------------
1           john        engineer    3               
3           laura       manager     4               
4           dave        engineer    2
select * from title_appearing_most;

title       max_total_appearance
----------  --------------------
engineer    3                   
manager     4
现在,只从视图中的
user\u中获取那些在
title\u中出现最多的
中有title和#外观匹配的记录

select ab.*
from user_in_both_A_B ab
inner join title_appearing_most m
    on ab.title = m.title
    and ab.total_appearance = m.max_total_appearance;
最终结果

id          name        title       total_appearance
----------  ----------  ----------  ----------------
1           john        engineer    3               
3           laura       manager     4               

视图将帮助您存储可按需执行且名称较短的查询。子查询中的子查询可以直观地避免,使阅读更简单。

答案有用吗?