2012-01-04 16 views
3

私はテーブル内の2列を比較すると、3つの事を与える必要があります:行の比較2列

  • Countが(チェックした総行数)一致する行の
  • カウントをチェックします(2列が一致した行)の異なる行の
  • カウント(2列が異なった行)

私は自分自身で結合を使用して行を一致させることができましたが、他のすべてを一度に取得する方法がわかりません。すべての情報を同時に取得することの重要性は、これが非常にアクティブな表であり、データが大きな頻度で変化するためです。

テーブルスキーマには、この問題とは関係のないデータが多数あるため、投稿できません。問題の列は両方ともint(11) unsigned NOT NULL DEFAULT '0'です。この目的のために、私はそれらをmaskmask_altと呼ぶでしょう。

+0

"マッチング"、 "違う"、 "チェック済み"の意味についてもう少し詳しく説明できますか? – Bohemian

+0

テーブルのスキーマを投稿してください。 –

+0

@johntotetwoo私はできませんが、私はそれについての詳細を追加しました。 – Jericon

答えて

4
select 
    count(*) as rows_checked, 
    sum(col = col2) as rows_matching, 
    sum(col != col2) as rows_different 
from table 

sum(condition)のエレガントな使用に注意してください。
これはmysqlのtrue1で、false0であるために機能します。合計すると、条件がtrueである回数がカウントされます。 case when condition then 1 else 0 endよりもはるかにエレガントです。単純にreturn condition;ではなく、if (condition) return true else return false;のSQLコードに相当します。

+0

これを今すぐ試してください。私はそれを過去の日に制限しました。残念ながら、制限しなければならない列の中にはインデックスが作成されていないものがあります。このため、約300 M行のテーブル全体がスキャンされています。S – Jericon

+0

インデックス付き列を使用して行を制限する方法はありますか?それ以上のことを実行してください。たとえば、データの最後の週に上限が表示されていると確信している場合は、最初に内側のエイリアスクエリとして最後の1週間分のデータを選択し、その結果を照会します。 – Bohemian

+0

私はそれを取り戻しました。私が制限していたいくつかの列は索引付けされていましたが、非常に高い基数はありませんでした。この表の800M行のうち、400Mをスキャンしなければなりませんでした。そのうち、143試合があった。それは過去10週間の結果です。 – Jericon

2

あなたはcol1があるかcol2に等しくない場合、あなたはCASEと相まって集約SUM()を使用することができ、行をカウントする意味と仮定:

SELECT 
    COUNT(*) AS total, 
    SUM(CASE WHEN col = col2 THEN 1 ELSE 0 END)AS matching, 
    SUM(CASE WHEN col <> col2 THEN 1 ELSE 0 END) AS non_matching 
FROM table 

COUNT(*)を得るために、より効率的かもしれサブクエリで、上記の値が十分でない場合は、マッチングを減算し​​て不一致を得るためにその値を使用します。

SELECT 
    total, 
    matching, 
    total - matching AS non_matching 
FROM 
(
    SELECT 
    COUNT(*) AS total, 
    SUM(CASE WHEN col = col2 THEN 1 ELSE 0 END)AS matching 
    FROM table 
) sumtbl