在SQL中选择公共列值

在SQL中选择公共列值,sql,sql-server,count,relational-division,having-clause,Sql,Sql Server,Count,Relational Division,Having Clause,我有一个SQL表,比如 docid State 12 MP 13 MP 14 MP 13 CG 14 CG 12 MH 13 MH 16 DL 我想要一个SQL查询,在这里我可以得到三个状态“MP”、“

我有一个SQL表,比如

 docid            State
12                  MP
13                  MP
14                  MP
13                  CG
14                  CG
12                  MH
13                  MH
16                  DL
我想要一个SQL查询,在这里我可以得到三个状态“MP”、“CG”、“MH”的结果,其中只有一个公共的“docid”


注意:状态是从用户id中输入的,其中States=“”

如果我理解正确,那么不是一个优雅但正确的解决方案应该是:

select distinct
    t1.docid
from
    table as t1
join table as t2 on t1.docid=t2.docid
join table as t3 on t3.docid=t2.docid
where
    t1.state <> t2.state
    and t2.state<>t3.state
    and t1.state<>t3.state
选择distinct
t1.docid
从…起
表as t1
将表作为t2连接到t1.docid=t2.docid
将表作为t3上的t3进行连接。docid=t2.docid
哪里
t1.状态t2.状态
和t2.statet3.state
和t1.statet3.state

如果我正确理解了您的意思,那么不是一个优雅但正确的解决方案应该是:

select distinct
    t1.docid
from
    table as t1
join table as t2 on t1.docid=t2.docid
join table as t3 on t3.docid=t2.docid
where
    t1.state <> t2.state
    and t2.state<>t3.state
    and t1.state<>t3.state
选择distinct
t1.docid
从…起
表as t1
将表作为t2连接到t1.docid=t2.docid
将表作为t3上的t3进行连接。docid=t2.docid
哪里
t1.状态t2.状态
和t2.statet3.state
和t1.statet3.state

这是一个关系划分问题。一种通用方法是使用
having
子句进行聚合和筛选,该子句统计表中可以找到多少不同的
状态
s:

select docid
from mytable
group by docid
having count(*) = (select count(distinct state) from mytable)
这假定没有重复的
(docid,state)
。否则,您需要:

having count(distinct state) = (select count(distinct state) from mytable)

这是一个关系划分问题。一种通用方法是使用
having
子句进行聚合和筛选,该子句统计表中可以找到多少不同的
状态
s:

select docid
from mytable
group by docid
having count(*) = (select count(distinct state) from mytable)
这假定没有重复的
(docid,state)
。否则,您需要:

having count(distinct state) = (select count(distinct state) from mytable)

我刚刚使用sqlite3使用以下SQL命令再现了您的场景:

CREATE TABLE tablename (
    docid INT,
    State VARCHAR(2)
);
INSERT INTO tablename VALUES (12,'MP');
INSERT INTO tablename VALUES (13,'MP');
INSERT INTO tablename VALUES (14,'MP');
INSERT INTO tablename VALUES (13,'CG');
INSERT INTO tablename VALUES (14,'CG');
INSERT INTO tablename VALUES (12,'MH');
INSERT INTO tablename VALUES (13,'MH');
INSERT INTO tablename VALUES (16,'DL');
然后,我可以使用以下工具查询您要查找的内容:

SELECT mp.docid AS Docid
FROM tablename AS mp
JOIN tablename AS cg ON mp.docid = cg.docid
JOIN tablename AS mh ON cg.docid = mh.docid
WHERE mp.State='MP' AND cg.State='CG' AND mh.State='MH';

它返回了
13

我刚刚使用sqlite3使用以下SQL命令重现您的场景:

CREATE TABLE tablename (
    docid INT,
    State VARCHAR(2)
);
INSERT INTO tablename VALUES (12,'MP');
INSERT INTO tablename VALUES (13,'MP');
INSERT INTO tablename VALUES (14,'MP');
INSERT INTO tablename VALUES (13,'CG');
INSERT INTO tablename VALUES (14,'CG');
INSERT INTO tablename VALUES (12,'MH');
INSERT INTO tablename VALUES (13,'MH');
INSERT INTO tablename VALUES (16,'DL');
然后,我可以使用以下工具查询您要查找的内容:

SELECT mp.docid AS Docid
FROM tablename AS mp
JOIN tablename AS cg ON mp.docid = cg.docid
JOIN tablename AS mh ON cg.docid = mh.docid
WHERE mp.State='MP' AND cg.State='CG' AND mh.State='MH';

返回的
13

如果要查看docid的N个最常见值以及所需的任何状态,则增加1

SQL SERVER

SELECT  [docid],
         COUNT([docid]) AS value_occurrence 
FROM    [SQLtable]
WHERE   [state] = "what ever state you want"
GROUP BY [docid]
ORDER BY value_occurrence DESC
FETCH FIRST 1 ROW ONLY;
并非所有数据库都支持这种语法。许多支持
限制

SELECT  [docid],
         COUNT([docid]) AS value_occurrence 
FROM    [SQLtable]
WHERE   [state] = "what ever state you want"
GROUP BY [docid]
ORDER BY value_occurrence DESC
LIMIT    1;

如果要查看docid的N个最常见值以及所需的任何状态,请增加1

SQL SERVER

SELECT  [docid],
         COUNT([docid]) AS value_occurrence 
FROM    [SQLtable]
WHERE   [state] = "what ever state you want"
GROUP BY [docid]
ORDER BY value_occurrence DESC
FETCH FIRST 1 ROW ONLY;
并非所有数据库都支持这种语法。许多支持
限制

SELECT  [docid],
         COUNT([docid]) AS value_occurrence 
FROM    [SQLtable]
WHERE   [state] = "what ever state you want"
GROUP BY [docid]
ORDER BY value_occurrence DESC
LIMIT    1;

我认为这可能会解决您的问题:

SELECT
   DISTINCT YT.docid
FROM <YOUR_TABLE> AS YT
WHERE
  1 = 1
  AND YT.user_id = <ID_USER>
  AND YT.State IN ('MP', 'CG', 'MH')
GROUP BY
  YT.docid, YT.State
选择
不同的YT.docid
从年初至今
哪里
1 = 1
和YT.user_id=
以及以('MP'、'CG'、'MH'表示的年度状态)
分组
本年度单据,本年度状态

我认为这可能会解决您的问题:

SELECT
   DISTINCT YT.docid
FROM <YOUR_TABLE> AS YT
WHERE
  1 = 1
  AND YT.user_id = <ID_USER>
  AND YT.State IN ('MP', 'CG', 'MH')
GROUP BY
  YT.docid, YT.State
选择
不同的YT.docid
从年初至今
哪里
1 = 1
和YT.user_id=
以及以('MP'、'CG'、'MH'表示的年度状态)
分组
本年度单据,本年度状态

搜索关系型分区另外,您在网站上研究过这个问题吗?这里有很多问题。我已经尝试过了,但找不到正确的答案,因为我正在使用where state in('MP','CG','MH'),所以它会显示任何状态的结果。显示您的尝试和当前输出。搜索关系分区。另外,您在网站上研究过这个问题吗?这里有很多问题。我尝试过,但找不到正确的答案,因为我使用的是where state in('MP','CG','MH'),所以它将显示任何状态的结果。显示您的尝试和当前输出。我想获得特定状态的结果。像MP,CG或MP,MH或CG,MH取决于用户。我想得到具体的状态。像MP,CG或MP,MH或CG,MH取决于用户。在SQL中运行良好,但在代码级别我必须做一些更改。非常感谢。在SQL中运行良好,但在代码级别我必须做一些更改。非常感谢。用户标记为SQL Server-不是MySQL。用户标记为SQL Server-不是MySQL。感谢您的帮助,Dale K。感谢您的帮助,Dale K。