我需要帮助来获得这种情况的解决方案。我有一个包含记录的表,有一个字段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次的所有记录行。请帮忙
答案 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的所有行。
id
和sku
是否可以互换?这对我来说并不清楚。 (如果id
依赖于sku
而sku
依赖于id
,那么您可以将对sku
的引用替换为对id
的引用那个问题。
答案 1 :(得分:4)
测试驱动的查询设计 - TDQD - 脱颖而出。
SELECT sku
FROM test
GROUP BY sku
HAVING COUNT(*) > 1
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 )