SQL Statement для выбора повторяющихся записей, которые появляются более чем в 2 раза

Мне нужна помощь, чтобы получить решение для этого условия. У меня есть таблица, содержащая записи, есть поле sku, в этой записи у меня появляется sku несколько раз. Структура таблицы выглядит так: | id | sku | name

rid is 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 раза в базу данных. Пожалуйста помоги

 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, которые появляются более одного раза в таблице. Мы можем присоединиться к результатам этого запроса к таблице, чтобы получить все строки, имеющие сов, которое соответствует.

Являются ли id и sku взаимозаменяемыми? Это мне было непонятно. (Если id зависит от sku а sku зависит от id , то вы можете заменить ссылки на sku со ссылками на id в этом запросе.

Тестовый дизайн запросов – 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 
 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) 

Этот запрос должен работать на вас:

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

Когда вы группируете 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 )