Select SQL 中的公共列值
Select Common Column Values in SQL
我有一个SQLtable喜欢
docid State
12 MP
13 MP
14 MP
13 CG
14 CG
12 MH
13 MH
16 DL
我想要一个 SQL 查询,在该查询中我可以获得所有三个州 "MP"、"CG"、"MH" 的公共 "docid" 结果
喜欢
Docid
13
注意:在 Where states = ""
中从用户 ID 输入状态
如果我没理解错的话,一个不优雅但正确的解决方案应该是:
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
这是一道关系除法题。一种通用方法是使用 having
子句进行聚合和过滤,该子句计算在 table:
中可以找到多少个不同的 state
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
如果您想查看 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;
我认为这可能会解决您的问题:
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
我有一个SQLtable喜欢
docid State
12 MP
13 MP
14 MP
13 CG
14 CG
12 MH
13 MH
16 DL
我想要一个 SQL 查询,在该查询中我可以获得所有三个州 "MP"、"CG"、"MH" 的公共 "docid" 结果
喜欢
Docid
13
注意:在 Where states = ""
中从用户 ID 输入状态如果我没理解错的话,一个不优雅但正确的解决方案应该是:
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
这是一道关系除法题。一种通用方法是使用 having
子句进行聚合和过滤,该子句计算在 table:
state
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
如果您想查看 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;
我认为这可能会解决您的问题:
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