2012-02-10 23 views
19

Tengo una tabla, algo así como esto:seleccionar varias filas con el mismo valor (s)

ID | Chromosome | Locus | Symbol | Dominance | 
=============================================== 
1 |  10  | 2 | A | Full | 
2 |  10  | 2 | a | Rec. | 
3 |  10  | 3 | B | Full | 
4 |  10  | 3 | b | Rec. | 

me gustaría para seleccionar todas las filas con el mismo locus y el cromosoma. Por ejemplo, las filas 3 y 4. Puede haber más de 2 a la vez y es posible que no estén en orden.

yo probamos este:

SELECT * 
FROM Genes 
GROUP BY Locus 
HAVING Locus='3' AND Chromosome='10' 

Pero siempre devuelve la fila 3, nunca se la fila 4, incluso cuando se repite. Creo que me falta algo obvio y simple, pero estoy perdido.

¿Alguien puede ayudar?

+0

las filas 1 y 2 también tienen el mismo locus del cromosoma y, lo que es lo que realmente quiere, como resultado de la consulta? – Lamak

+0

Lamak: deseo seleccionar un determinado locus y cromosoma y obtener todas las filas que coincidan. – user1202673

Respuesta

36

Debe comprender eso cuando incluya GROUP BY en su consulta le indica a SQL que combine filas. obtendrá una fila por valor único de Locus. El Having luego filtra esos grupos. Por lo general, se especifica una función aggergate en la lista de selección como:

--show how many of each Locus there is 
SELECT COUNT(*),Locus FROM Genes GROUP BY Locus 

--only show the groups that have more than one row in them 
SELECT COUNT(*),Locus FROM Genes GROUP BY Locus HAVING COUNT(*)>1 

--to just display all the rows for your condition, don't use GROUP BY or HAVING 
SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10' 
+0

Entonces, sí, el problema fue con mi código php, no con mi código sql.* blush * Volví a mi sintaxis original de 'SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10'' como muchos sugirieron, arreglé mi código php, ¡y todo está bien con el mundo! ¡Sabía que era algo simple y obvio que me estaba perdiendo! ¡Gracias a todos! – user1202673

2

El problema es GROUP BY - si agrupa los resultados por Locus, solo obtendrá un resultado por locus.

Probar:

SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10'; 

Si prefiere utilizar HAVING sintaxis, entonces GROUP BY id o algo que no se repite en el conjunto de resultados.

+0

Esa es realmente la sintaxis original que utilicé. It y 'GROUP BY id' ambos dan el mismo resultado. – user1202673

8

Suponiendo que desea que todas las filas para las que existe otra fila con exactamente el mismo Chromosome y Locus:

Usted puede lograr esto mediante la unión de la mesa para sí mismo, sino sólo la devolución de las columnas de uno " "de la unión".

El truco es establecer la condición de unión a "el mismo locus y el cromosoma":

select left.* 
from Genes left 
inner join Genes right 
on left.Locus = right.Locus and 
    left.Chromosome = right.Chromosome and left.ID != right.ID 

También puede ampliar fácilmente esto mediante la adición de un filtro en un -clause where.

+0

gracias, este me funcionó: D – Denslat

+0

@Matt Fenwick ¡Muchas gracias! Esto ayudó mucho. – user3553260

1

Esto puede funcionar para usted:

select t1.* 
from table t1 
join (select t2.Chromosome, t2.Locus 
    from table2 
    group by t2.Chromosome, t2.Locus 
    having count(*) > 1) u on u.Chromosome = t1.Chromosome and u.Locus = t1.Locus 
0

Una forma de hacer esto es a través de un exists cláusula:

select * from genes g 
where exists 
(select null from genes g1 
where g.locus = g1.locus and g.chromosome = g1.chromosome and g.id <> g1.id) 

Alternativamente, en MySQL se puede obtener un resumen de todos los identificadores de juego con una acceso a una sola tabla, usando group_concat:

select group_concat(id) matching_ids, chromosome, locus 
from genes 
group by chromosome, locus 
having count(*) > 1 
Cuestiones relacionadas