有人可以帮助我执行查询,其中删除查询的重复元素
Select * from table where APPNAME = 'Ap1' or APPNAME= 'Ap2'
使用DISTINCT的结果
id | APPNAME| USERNAME|
1 Ap1 User1
2 Ap2 User1
3 Ap1 User3
4 Ap2 User4
5 Ap1 User5
6 Ap1 User6
7 Ap2 User6
在此表中,用户1和6都具有两个应用程序。必须从查询中删除这两个用户。
预期结果是
id | APPNAME| USERNAME|
1 Ap1 User3
2 Ap2 User4
3 Ap1 User5
如果我使用DISTINCT,那么它将消除重复项,因此我需要将两者都消除。
使用DISTINCT的结果
id | APPNAME| USERNAME|
1 Ap1 User1
2 Ap1 User3
3 Ap2 User4
4 Ap1 User5
5 Ap2 User6
谢谢
答案 0 :(得分:0)
select distinct * from table where APPNAME = 'Ap1' or APPNAME= 'Ap2' group by APPNAME having (count(APPNAME)=1);
答案 1 :(得分:0)
除非有语法问题(很可能是AS
关键字)阻止它在MySQL中正常工作,否则这似乎应该可行:
SELECT *
FROM table AS t
WHERE (t.appname = 'Ap1' OR t.appname = 'Ap2')
AND t.username NOT IN
(SELECT u.username
FROM table AS u
WHERE (u.appname = 'Ap1' OR u.appname = 'Ap2')
GROUP BY u.username
HAVING COUNT(*) > 1
)
子查询列出了Ap1
和Ap2
列表中具有多个条目的用户名,而NOT IN则从主查询结果中排除了这些用户名。请注意,子查询在appname
上使用与主查询相同的过滤器,以确保一致性。否则,您可能会忽略拥有Ap1
和Ap3
的人,但是应该将它们包括在内,因为他们只有Ap1
和Ap2
中的一个。
除了MySQL以外,大多数SQL DBMS都必须使用这种子查询方法,这也适用于MySQL。可能还有一些使用OLAP窗口函数的技术。但是,MySQL对于选择列表和GROUP BY子句中允许/要求的内容也有不同的规则-标准SQL要求选择列表中出现的非聚合列必须在GROUP BY子句中列出,大多数SQL DBMS遵循那条规则。据我了解,MySQL并非如此,这可能允许使用替代的(更简单的)表述,但它们将成为不一定在其他DBMS中起作用的表述(对您可能或不重要)。
表别名(由AS
关键字引入)不是100%必需的;查询在没有它们的情况下可以正常工作(删除AS [tu]
子句,并删除t.
和u.
前缀)。在另一个SQL DBMS(Informix 12.10)上进行测试,此方法有效(verbatim — Informix允许将大多数关键字用作对象名,而无需将其视为用双引号引起来的定界标识符):
DROP TABLE IF EXISTS table;
CREATE TABLE table
(
id INTEGER NOT NULL PRIMARY KEY,
appname VARCHAR(10) NOT NULL,
username VARCHAR(10) NOT NULL
);
INSERT INTO table VALUES(1, 'Ap1', 'User1');
INSERT INTO table VALUES(2, 'Ap2', 'User1');
INSERT INTO table VALUES(3, 'Ap1', 'User3');
INSERT INTO table VALUES(4, 'Ap2', 'User4');
INSERT INTO table VALUES(5, 'Ap1', 'User5');
INSERT INTO table VALUES(6, 'Ap1', 'User6');
INSERT INTO table VALUES(7, 'Ap2', 'User6');
SELECT *
FROM table
WHERE (appname = 'Ap1' OR appname = 'Ap2')
AND username NOT IN
(SELECT username
FROM table
WHERE (appname = 'Ap1' OR appname = 'Ap2')
GROUP BY username
HAVING COUNT(*) > 1
);
输出为:
3 Ap1 User3
4 Ap2 User4
5 Ap1 User5
请注意,我将ID
列视为物理列,因此从原始数据集中选择值。如果它不是物理列,请不要在问题中显示它,也不要显示它是如何生成的。