2012-02-10 21 views
19

Ho una tabella, un po 'come questo:selezionare più righe con lo stesso valore (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. | 

mi piacerebbe per selezionare tutte le righe con lo stesso locus e cromosomica. Ad esempio, righe 3 e 4. Possono esserci più di 2 alla volta e potrebbero non essere in ordine.

ho provato questo:

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

ma restituisce sempre riga 3, mai riga 4, anche se ripetuto. Penso che mi manchi qualcosa di ovvio e semplice, ma sono in perdita.

Qualcuno può aiutare?

+0

righe 1 e 2 hanno anche lo stesso locus e cromosomi, che cosa si vuole realmente come un risultato della query? – Lamak

+0

Lamak - voglio selezionare un certo luogo e cromosomi e ottenere tutte le righe che corrispondono. – user1202673

risposta

36

È necessario capire che quando si includere GROUP BY nella query SQL si sta dicendo per combinare righe. otterrai una riga per valore univoco Locus. Lo Having quindi filtra questi gruppi. Di solito si specifica una funzione aggergate nella lista di selezione del tipo:

--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

Quindi, il problema era con il mio codice php, non con il mio codice SQL.* blush * Sono tornato alla mia sintassi originale di 'SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10'' come suggerito da molti, corretto il mio codice php e tutto a posto con il mondo! Sapevo che era qualcosa di semplice e ovvio che mi mancava! Grazie a tutti! – user1202673

2

Il problema è GROUP BY - Se si raggruppano i risultati per Locus, si ottiene un solo risultato per locus.

Prova:

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

Se si preferisce usare HAVING sintassi, quindi GROUP BY id o qualcosa che non sta ripetendo nel set di risultati.

+0

Questa è in realtà la sintassi originale che ho usato. Sia "GROUP BY id" danno entrambi lo stesso risultato. – user1202673

8

Supponendo che si desidera tutte le righe per le quali v'è un'altra fila con la stessa identica Chromosome e Locus:

È possibile raggiungere questo obiettivo unendo la tabella con se stessa, ma solo tornando le colonne da un "lato "del join.

Il trucco è quello di impostare la condizione di join per "lo stesso locus e 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 

è anche possibile estendere facilmente questo con l'aggiunta di un filtro in un where -clause.

+0

grazie, questo ha funzionato per me: D – Denslat

+0

@ Fen Fenwick Grazie mille! Questo ha aiutato molto. – user3553260

1

Questo può funzionare per voi:

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

Un modo per farlo è attraverso un exists clausola:

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) 

In alternativa, in MySQL è possibile ottenere un riepilogo di tutti gli ID di corrispondenza con un accesso al tavolo singolo, utilizzando group_concat:

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