Declaración SQL para seleccionar loggings duplicates que aparecen más de 2 veces

Necesito ayuda para get la solución para esta condición. Tengo una tabla que contiene loggings, hay un campo sku, en este logging tengo Sku apareciendo varias veces. La estructura de la tabla es como esta rid | id | sku | name

rid es auto_increment, donde id es varchar, si hay sku disponible en la tabla varias veces, el logging se ve así

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 

Utilicé esta statement sql para get loggings que aparecen solo una vez

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

Esto trae los loggings que solo se agregan una vez, por lo que de acuerdo con lo anterior, registre solo que deshacerse de 6 es la salida

Traté de modificar el código anterior para get el resultado de los loggings que se agregaron 2 veces

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

El resultado que obtengo es de esos loggings que se agregan 2 veces, pero el problema es que la salida está apareciendo solo en 1 logging como este;

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

Necesito search todas las filas de logging que se agregan 2 veces en la database. Por favor ayuda

 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 

La vista en línea aliased como d devuelve los valores de sku que aparecen más de una vez en la tabla. Podemos unir los resultados de esa consulta a la tabla para get todas las filas que tengan un sku que coincida.

¿Son id y sku intercambiables? Eso no estaba claro para mí. (Si id depende de sku y sku depende de id , entonces puede replace references a sku con references a id en esa consulta.

Test Driven Query Design – TDQD – en primer plano.

Encuentra los SKU que aparecen más de una vez

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

Encuentre los detalles de todas las filas donde aparece el SKU más de una vez

 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) 

Esta consulta debería funcionar para usted:

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

Cuando agrupa por Id no puede get más de un Id en el grupo, por lo tanto COUNT(Id) es siempre 1. Use esto en su lugar

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

Si quiere get todos los loggings con más de un sku duplicado, use esto:

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