2011-06-02 19 views
9

Tengo una tabla muy simple que acaba de part_id y part_type:seleccionar ID duplicados en MySQL

CREATE TABLE `temp` (
`part_id` INT NOT NULL , 
`part_type` CHAR(5) NOT NULL 

Esto tiene una larga lista de la parte ID y tipos. Sin embargo, algunas partes tienen más de un tipo. ¿Cómo obtendría los ID de solo las partes que tienen más de un tipo? Estaba pensando en algo como esto funcionaría: sin embargo

SELECT * FROM temp WHERE part_in IN (SELECT count(part_id) as duplicates FROM temp WHERE 1 GROUP BY part_id) AND duplicates > 1

, esto es claramente solo psuedocode y falla. Gracias por tu ayuda.

Respuesta

18
select part_id from temp 
group by part_id 
having count(*) > 1 

Esto le dará los part_id's con más de una fila. A continuación, puede ajustarlo como su consulta de ejemplo para obtener todos los datos part_id/part_type de todas las partes con más de una fila.

select * from temp 
where part_id in (select part_id from temp 
        group by part_id 
        having count(*) > 1) 
order by part_id 
+0

eso es todo! gracias Fosco. No pensé en el "tener". – julio

+0

además: si también está interesado en el valor de recuento (es casi gratis para el db) puede modificar la selección a lo siguiente: seleccionar part_id, contar (*) como mycount desde la temperatura ... – thomas

4

Me encanta GROUP_CONCAT para estas cosas, porque le da la respuesta a esta pregunta (cuántos) y la siguiente pregunta (qué tipos).

select part_type, count(*), group_concat(part_id) 
from temp 
group by 1 
having count(*) > 1; 
+0

Esto da un conjunto diferente de datos que el OP solicitado, pero sí, esta es una consulta imp para encontrar duplicados concatenados en una fila con una sola consulta. – ThinkCode

+0

¿Qué es 'GROUP BY 1'? – powtac

+0

"agrupar por 1" es un acceso directo al primer campo, por lo que es idéntico a "grupo por tipo_partida" en este caso. –