4

我需要帮助来解决这种情况。我有一个包含记录的表,有一个字段 sku,在这个记录中我有 sku 多次出现。表结构是这样的 rid|id|sku|name

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 )

这带来了只添加一次的记录,所以根据上面给出的记录,只有 rid 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 次的所有记录行。请帮忙

4

5 回答 5

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

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

idsku可互换的吗?我不清楚。(如果idisdependent onsku并且skuisdependent on id,那么您可以在该查询中将引用替换为sku对的引用。id

于 2013-01-26T20:51:29.580 回答
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
于 2013-01-26T20:56:55.573 回答
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)
于 2013-01-26T20:43:03.967 回答
0

此查询应该适合您:

SELECT * FROM test WHERE 
   id IN(SELECT id FROM test group by id HAVING count(id) > 1)
于 2013-01-26T20:36:59.837 回答
0

当您分组时,Id您不能在组中获得多个 ID,因此COUNT(Id)始终为 1。请改用此ID

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

如果您想获取具有多个重复项的所有记录,请sku使用以下命令:

SELECT * FROM test 
GROUP BY id 
HAVING ( COUNT(sku) > 1 )
于 2013-01-26T20:43:10.940 回答