SQL语句用于选择出现超过2次的重复记录

时间:2013-01-26 20:34:12

标签: php mysql sql

我需要帮助来获得这种情况的解决方案。我有一个包含记录的表,有一个字段sku,在这个记录中我有多次出现sku。 表结构是这样的 摆脱| ID | SKU |名称

rid是auto_increment,其中id是varchar,如果表上有任何sku多次,则记录看起来像这样

rid  id  sku     name
---  --  ------  --------------
1    3   rs-123  test product
2    3   rs-123  test product
3    4   rs-125  test product 2
4    4   rs-125  test product 2
5    4   rs-125  test product 2
6    6   rs-126  test product 3

我使用这个sql语句来获取只出现一次的记录

SELECT *
FROM test
GROUP BY id
HAVING ( COUNT(id) = 1 )

这会带来只添加一次的记录,所以根据上面给出的记录只有删除6是输出

我尝试将上面的代码修改为此以获取添加2次的记录的结果

    SELECT * FROM test 
GROUP BY id 
HAVING ( COUNT(id) = 2 )

我得到的结果是那些被添加2次的记录,但问题是输出只出现这样的1条记录;

rid  id  sku     name
---  --  ------  ------------
1    3   rs-123  test product

我需要获取在数据库中添加2次的所有记录行。请帮忙

5 个答案:

答案 0 :(得分:7)

SELECT t.rid
     , t.id
     , t.sku
     , t.name
  FROM test t
  JOIN ( SELECT s.sku 
           FROM test s 
          GROUP BY s.sku
         HAVING COUNT(1) > 1
       ) d
    ON d.sku = t.sku

作为d别名的内联视图返回在表格中出现多次的sku值。我们可以将该查询的结果加入到表中,以获得具有匹配的sku的所有行。

idsku是否可以互换?这对我来说并不清楚。 (如果id依赖于skusku依赖于id,那么您可以将对sku的引用替换为对id的引用那个问题。

答案 1 :(得分:4)

测试驱动的查询设计 - TDQD - 脱颖而出。

查找多次出现的SKU

SELECT sku
  FROM test
 GROUP BY sku
HAVING COUNT(*) > 1

查找SKU出现多次的所有行的详细信息

SELECT t.*
  FROM test AS t
  JOIN (SELECT sku
          FROM test
         GROUP BY sku
        HAVING COUNT(*) > 1
       ) AS s
    ON t.sku = s.sku

答案 2 :(得分:3)

CREATE TABLE test
(rid INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,id INT NOT NULL
,sku VARCHAR(12) NOT NULL
,name VARCHAR(20) NOT NULL
);

INSERT INTO test VALUES 
(1,3,'rs-123','test product'),
(2,3,'rs-123','test product'),
(3,4,'rs-125','test product 2'),
(4,4,'rs-125','test product 2'),
(5,4,'rs-125','test product 2'),
(6,6,'rs-126','test product 3');

SELECT x.* FROM test x JOIN test y ON y.id = x.id GROUP BY x.rid HAVING COUNT(*) > 1;
+-----+----+--------+----------------+
| rid | id | sku    | name           |
+-----+----+--------+----------------+
|   1 |  3 | rs-123 | test product   |
|   2 |  3 | rs-123 | test product   |
|   3 |  4 | rs-125 | test product 2 |
|   4 |  4 | rs-125 | test product 2 |
|   5 |  4 | rs-125 | test product 2 |
+-----+----+--------+----------------+
5 rows in set (0.01 sec)

答案 3 :(得分:0)

此查询应该适合您:

SELECT * FROM test WHERE 
   id IN(SELECT id FROM test group by id HAVING count(id) > 1)

答案 4 :(得分:0)

Id分组时,您无法在群组中获得多个ID,因此COUNT(Id)始终为1.请改用

SELECT * FROM test 
GROUP BY id 
HAVING ( COUNT(sku) = 2 )

如果您想要获得包含多个重复sku的所有记录,请使用以下命令:

SELECT * FROM test 
GROUP BY id 
HAVING ( COUNT(sku) > 1 )