2012-02-10 6 views
19

Mam tabeli, coś jak to:wybrać wiele wierszy o tej samej wartości (ów)

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

Chciałbym zaznaczyć wszystkie wiersze z tego samego locus i chromosomie. Na przykład wiersze 3 i 4. Może być więcej niż 2 naraz i mogą nie być w porządku.

Próbowałem to:

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

Ale zawsze zwraca wiersz 3, wiersz 4 nigdy, nawet gdy powtarzane. Myślę, że brakuje mi czegoś oczywistego i prostego, ale brakuje mi tego.

Czy ktoś może pomóc?

+0

wiersze 1 i 2 mają również to samo miejsce i chromosom, co właściwie chcesz uzyskać w wyniku zapytania? – Lamak

+0

Lamak - Chcę wybrać określone locus i chromosom i uzyskać wszystkie wiersze, które pasują. – user1202673

Odpowiedz

36

Musisz to zrozumieć, kiedy włącz GROUP BY w zapytaniu, które mówi SQL, aby połączyć wiersze. otrzymasz jeden wiersz na unikalną wartość Locus. Having następnie filtruje te grupy. Zwykle określasz funkcję agresywną na liście wyboru, takiej jak:

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

Tak, tak, problem dotyczył mojego kodu PHP, a nie mojego kodu SQL.* rumieniec * Wróciłem do mojej oryginalnej składni "SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10'' jak wielu sugerowało, naprawiłem mój kod php, i wszystko w porządku ze światem! Wiedziałem, że to było coś prostego i oczywistego, czego mi brakowało! Dziękuję wszystkim! – user1202673

2

Problem to GROUP BY - jeśli zgrupujesz wyniki według Locus, otrzymasz tylko jeden wynik na każdy locus.

Spróbuj:

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

Jeśli wolisz korzystać HAVING składnię, a następnie GROUP BY id lub coś, co nie jest powtarzalny w zestawie wyników.

+0

To jest właściwie oryginalna składnia, której użyłem. To i 'GROUP BY id' zarówno dają taki sam wynik. – user1202673

8

Zakładając, że chcesz wszystkie wiersze, dla których istnieje inny wiersz z dokładnie to samo Chromosome i Locus:

Można to osiągnąć poprzez łączenie tabeli do siebie, ale tylko powrocie kolumny z jednej „stronie "z przyłączenia.

Sztuką jest, aby ustawić warunek dołączenia do „tego samego locus i chromosomie”:

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

Można również łatwo rozszerzyć, dodając filtr w where -clause.

+0

dzięki, ten zadziałał dla mnie: D – Denslat

+0

@Matt Fenwick Dziękuję bardzo! To bardzo pomogło. – user3553260

1

ten może pracować dla Ciebie:

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

Jednym ze sposobów na to jest poprzez exists klauzuli:

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) 

Alternatywnie, w MySQL można uzyskać podsumowanie wszystkich pasujących identyfikatorów z dostęp do pojedynczej tabeli, użycie group_concat:

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