我需要帮助来解决这个问题。我有一个包含记录的表,有一个字段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 )
这带来了只添加一次的记录,因此根据上面的记录,只有RID6是输出
我尝试修改上面的代码,以获得添加了2次的记录的结果
SELECT * FROM test
GROUP BY id
HAVING ( COUNT(id) = 2 )
我得到的结果是那些被添加了2次的记录,但问题是输出只出现了1条这样的记录;
rid id sku name
--- -- ------ ------------
1 3 rs-123 test product
我需要获取在数据库中添加了2次的所有记录行。请帮帮忙
发布于 2013-01-27 04:51:30
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
的引用。
发布于 2013-01-27 04:56:56
测试驱动的查询设计-- 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-27 04:43:04
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)
https://stackoverflow.com/questions/14541307
复制相似问题