2017-01-01 5 views
0

からの値に基づいて、すべての重複を取得するには、少なくとも2つの等価(COL3、COL4) 。 しかし、col3の値によっては1行だけが発生するという結果が得られます。誰も理由を説明できますか?MySQLのクエリが2列

別の言葉では、ペア(col3、col4)が複数回出現するすべての行を取得するクエリを作成しようとしています。列COL3から

id - col1 - col2 - col3 - col4 - c  
123- val1 val123 43 val444 2 
456- val14 val52 45 val444 2 

43は決して結果に発生していないが、私は期待:

予期せぬ結果の例がこれです。さもなければ、この行は結果にあるべきではありません。正しい

select * from ukberu1m where col3=43 and col4=val444; 

は元のテーブル内の2つの結果を与えるが、結果テーブルに一つだけの行が甘い基準、何らかの理由によるもの2で表示されます。

+1

そのクエリは、あなたが望むことを行う必要があります。間違った結果を得るサンプルデータを投稿できますか? – Barmar

+0

group by句にリストされている以外の集計されていない列を選択することがあります。すべての列を取得するには、サブクエリ –

答えて

2

それぞれのインスタンスが1つではなく、重複している行をすべて表示する場合は、元のテーブルとクエリを結合する必要があります。

SELECT t1.* 
FROM mytable AS t1 
JOIN (SELECT col3, col4 
     FROM mytable 
     GROUP BY col3, col4 
     HAVING COUNT(*) > 1) AS t2 
ON t1.col3 = t2.col3 AND t1.col4 = t2.col4 
ORDER BY col4, col3 
+0

を使用してください。それをテストするのに時間がかかりました。できます。質問の質問がなぜ違うのか説明していただければ幸いです。グループ化 - はい。なぜ最初の行だけが表示されますか?どうもありがとう。 – Haradzieniec

+1

これは 'GROUP BY'の動作です。同じ値を持つすべての行を1つの行にまとめます。 – Barmar

+1

特定の列の合計を取得する場合は、 'GROUP BY'を使用します。日付で行を数えたい場合と同様に、 'SELECT DATE(timestamp)as date、COUNT(*)... GROUP BY date'を使用します。 – Barmar

1

idが行ごとに一意であると仮定すると、別の方法は次のとおりです。

select t.* 
from mytable t 
where exists (select 1 
       from mytable t2 
       where t2.col3 = t.col3 and t2.col4 = t.col4 and t2.id <> t.id 
      ); 

この方法の利点は、それがmytable(col3, col4)上のインデックスの非常に優れた利点を取ることができるということです。