如何排除重复的行? (去掉)

时间:2019-01-02 19:01:59

标签: mysql select

有人可以帮助我执行查询,其中删除查询的重复元素

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

谢谢

2 个答案:

答案 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
       )

子查询列出了Ap1Ap2列表中具有多个条目的用户名,而NOT IN则从主查询结果中排除了这些用户名。请注意,子查询在appname上使用与主查询相同的过滤器,以确保一致性。否则,您可能会忽略拥有Ap1Ap3的人,但是应该将它们包括在内,因为他们只有Ap1Ap2中的一个。

除了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列视为物理列,因此从原始数据集中选择值。如果它不是物理列,请不要在问题中显示它,也不要显示它是如何生成的。