【问题标题】:show duplicate data mysql and where clause显示重复数据mysql和where子句
【发布时间】:2020-05-14 02:50:25
【问题描述】:

我有这样的表格和记录

我想显示重复的代码数据,其中位置是 a,我希望 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 出现,因为它们都是重复的

--------更新-----------

固定
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'
)

为了更快,只需在INNER JOIN 之后添加WHERE 而不要使用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 会解决这个问题

【问题讨论】:

    标签: mysql sql database join


    【解决方案1】:

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

    【讨论】:

    • 是的,但我想在 WHERE place = 'a' 但只有 foo 显示我希望 foo 2 也显示
    • 不错,就像我预期的那样,但是查询对于处理我在本地数据库中实现的具有 40000++ 行的大数据来说很繁重,而且我超时了
    • @good112233 这个带有exists 的查询在性能方面应该表现得非常好。但如果您喜欢这个答案,请点击勾选标记接受它。谢谢
    • 是的,但在我的情况下真的很慢
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2014-04-27
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多