【问题标题】:Select Common Column Values in SQL在 SQL 中选择公共列值
【发布时间】:2020-06-11 09:04:21
【问题描述】:

我有一个类似的 SQL 表

 docid            State
12                  MP
13                  MP
14                  MP
13                  CG
14                  CG
12                  MH
13                  MH
16                  DL

我想要一个 SQL 查询,在该查询中我可以得到一个只有公共“docid”的结果,用于所有三个状态“MP”、“CG”、“MH”

喜欢

Docid   
13

注意:状态是从 Where states = "" 中的用户 ID 输入的

【问题讨论】:

  • 搜索关系划分
  • 另外,你在网站上研究过这个问题吗?这里经常被问到。
  • 我已经尝试过,但找不到正确的答案,因为我使用 where state in ('MP','CG','MH') 所以它会显示任何状态的结果。跨度>
  • 显示您的尝试和当前输出。

标签: sql sql-server count relational-division having-clause


【解决方案1】:

我刚刚使用 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

【讨论】:

  • 在 SQL 中工作正常,但在代码级别我必须做一些更改。谢谢!
【解决方案2】:

这是一个关系划分问题。一种通用方法是使用 having 子句进行聚合和过滤,该子句计算在表中可以找到多少不同的 states:

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)

【讨论】:

  • 我想获取特定状态。像 MP、CG 或 MP、MH 或 CG、MH 取决于用户。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    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
    

    【讨论】:

    • 感谢 Dale K 的帮助。
    【解决方案5】:

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

    SQL 服务器

    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;
    

    并非所有数据库都支持该语法。多多支持LIMIT

    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;
    

    【讨论】:

    • 用户标记的 SQL Server - 不是 MySQL。
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多