次のような表があります。
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. |
同じ遺伝子座と染色体を持つすべての行を選択したいと思います。たとえば、3行目と4行目です。一度に2つ以上ある場合がありますが、順序が正しくない場合があります。
私はこれを試しました:
SELECT *
FROM Genes
GROUP BY Locus
HAVING Locus='3' AND Chromosome='10'
ただし、繰り返しても、行4ではなく行3を常に返します。明らかでシンプルなものが欠けていると思いますが、私は途方に暮れています。
誰か助けてもらえますか?
クエリにGROUP BY
を含めると、行を結合するようにSQLに指示していることを理解する必要があります。一意のLocus
値ごとに1行を取得します。 Having
はそれらのグループをフィルターします。通常、次のような選択リストでaggergate関数を指定します。
--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'
まったく同じChromosome
とLocus
:: =を持つ別の行があるすべての行が必要だと仮定します
これを実現するには、テーブルをそれ自体に結合しますが、結合の1つの「サイド」から列を返すだけです。
トリックは、結合条件を「同じ遺伝子座と染色体」に設定することです。
select left.*
from Genes left
inner join Genes right
on left.Locus = right.Locus and
left.Chromosome = right.Chromosome and left.ID != right.ID
where
句にフィルターを追加することで、これを簡単に拡張することもできます。
問題は GROUP BY
-結果を軌跡ごとにグループ化すると、軌跡ごとに1つの結果しか取得できません。
試してください:
SELECT * FROM Genes WHERE Locus = '3' AND Chromosome = '10';
HAVING
構文を使用する場合は、GROUP BY id
または結果セットで繰り返されないもの。
これはあなたのために働くかもしれません:
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
これを行う1つの方法は、exists
句を使用することです。
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)
または、MySQLでは、group_concat
を使用して、単一のテーブルアクセスで一致するすべてのIDの概要を取得できます。
select group_concat(id) matching_ids, chromosome, locus
from genes
group by chromosome, locus
having count(*) > 1