web-dev-qa-db-ja.com

同じ値を持つ複数の行を選択します

次のような表があります。

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を常に返します。明らかでシンプルなものが欠けていると思いますが、私は途方に暮れています。

誰か助けてもらえますか?

23
user1202673

クエリに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'
39
KM.

まったく同じChromosomeLocus :: =を持つ別の行があるすべての行が必要だと仮定します

これを実現するには、テーブルをそれ自体に結合しますが、結合の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句にフィルターを追加することで、これを簡単に拡張することもできます。

9
Matt Fenwick

問題は GROUP BY-結果を軌跡ごとにグループ化すると、軌跡ごとに1つの結果しか取得できません。

試してください:

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

HAVING構文を使用する場合は、GROUP BY idまたは結果セットで繰り返されないもの。

2
JYelton

これはあなたのために働くかもしれません:

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
dasblinkenlight

これを行う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
0
user359040