显示重复的数据mysql和where子句

时间:2020-05-14 02:50:25

标签: mysql sql database join

我有这样的表和记录

my table

我要在WHERE位置显示重复的代码数据,我要显示foo和foo 2,因为它们重复但foo 2不显示

我可以使用此查询显示所有重复的数据:

SELECT * FROM myTable
         WHERE code 
              IN (SELECT * FROM (SELECT code
                 FROM myTable
                 GROUP BY code
                     HAVING COUNT(code) > 1)
                  AS a)

但是在添加位置

SELECT * FROM myTable
         WHERE code 
              IN (SELECT * FROM (SELECT code
                 FROM myTable
                 GROUP BY code
                     HAVING COUNT(code) > 1)
                  AS a) AND place = 'a'

只显示foo,我也希望foo 2出现,因为它们都是重复的

-------- UPDATE -----------

固定为

SELECT * 
FROM myTable m1
WHERE exists 
    (
        SELECT code
        FROM myTable m2
        where m1.code = m2.code
        and place = 'a'
)

但这不会过滤重复的数据,因此您需要与WHERE IN

结合使用
SELECT * FROM myTable
         WHERE code 
              IN (SELECT * FROM (SELECT code
                 FROM myTable
                 GROUP BY code
                     HAVING COUNT(code) > 1)
                  AS a)
AND exists 
    (
        SELECT code
        FROM myTable m2
        where m1.code = m2.code
        and place = 'a'
)

但是执行大数据仍然很慢,WHERE IN可以随INNER JOIN进行更改

SELECT * 
FROM myTable m1
INNER JOIN (
    SELECT code
    FROM myTable 
    GROUP BY code
    HAVING COUNT( code ) > 1
) m2 ON m1.code=m2.code WHERE exists 
    (
        SELECT code
        FROM myTable m2
        where m1.code = m2.code
        and place = 'a'
)

要提高速度,只需在WHERE之后添加INNER JOIN,而不要使用WHERE INWHERE EXISTS

SELECT * 
FROM myTable m1
INNER JOIN (
SELECT code
    FROM myTable 
    GROUP BY code
    HAVING COUNT( code ) > 1
) m2 ON m1.code=m2.code 
WHERE 
    (m1.place = "a" OR m2.place = "a")

但这会引发错误SELECT list is not in GROUP BY clause and contains nonaggregated column … incompatible with sql_mode=only_full_group_by,而这个solution将解决此问题

2 个答案:

答案 0 :(得分:2)

使用exists尝试以下操作。这是demo

SELECT * 
FROM myTable m1
WHERE exists 
    (
        SELECT code
        FROM myTable m2
        where m1.code = m2.code
        and place = 'a'
)

输出:

| id   | code   | name  | place |
| ---- | ------ | ----- | ----- |
| 1001 | 110004 | foo   | a     |
| 1002 | 110004 | foo 2 | b     |

答案 1 :(得分:0)

您可以对以下查询执行的其他解决方法

      SELECT tmp.*
      FROM mytable tmp
      INNER JOIN mytable tmp1 ON tmp1.Code = tmp.Code
                 And tmp1.id < tmp.Id
      WHERE tmp1.place = 'a'
相关问题