2017-12-09 18 views
1

MySQL Markup Records with Duplicates on Selectと接続します。違いは、実際に複製されたレコードだけでなく、同じ値を持つすべてレコードのマークアップだけです。最初のレコードはです。MySQLマークアップ同一の値を持つ選択のすべてのレコード(最初のものを含む)

id  name 
-------------- 
1  John # mark this 
2  Peter 
3  John # this 
4  David 
5  John # and this 

@ M-カリド・junaid https://stackoverflow.com/a/47728321/1056384

SELECT DISTINCT a.*, 
CASE WHEN b.id IS NULL THEN 0 ELSE 1 end `duplicate` 
FROM tab a 
LEFT JOIN tab b ON a.name = b.name AND a.id > b.id 
ORDER BY a.id 

によって提案されたアプローチそれは私のために1つのまたは2つの問題があります。それは、 "複製" レコードの最初の発生をマークアップしませ

  1. をグループで。
  2. それは、order byID(それが依存している場合かわからない)を使用していますが、私はさまざまな方法で現実の複雑なクエリの結果ソートする必要があります。

クエリの最適化に意味がある場合、私の仕事は少し複雑です。実は、私はグループ内の重複をマークアップする必要があります。

id group name 
-------------- 
1 1  John # mark this (dups in group #1) 
2 1  Peter 
3 1  John # mark this (dups in group #1) 
4 2  David 
5 2  John # this is not (it's in group #2) 
+1

1.あなたはちょうど '>' '><'に変更する必要があります。 2. ORDER BY句で必要なものを使用することができます。しかし、それを指定することなく、誰もあなたを助けることはできません。 –

+0

うわー。それは本当にうまくいく。しかし、その背後にある論理を説明できますか? b-tableの<>レコードはどのように同じIDに結合していますか? – vatavale

+0

その参加は**同じではありません** id。 '<>'は* not equal *です。 '!='を使用することもできます。 –

答えて

0

は、あなたのニーズに特定のクエリを調整することができますが、私はここの代わりに参加するのサブクエリをEXISTS使用します。

select t.id, t.group, t.name, exists (
    select * from tab t2 
    where t2.group = t.group 
    and t2.name = t.name 
    and t2.id <> t.id 
) as is_duplicate 
from tab t 
order by t.group, is_duplicate, t.name 

http://sqlfiddle.com/#!9/d24012/4

+0

ありがとうございます。 'LEFT JOIN 'タブよりも速いですか?t.name = t2.nameとt.group = t2.groupとt.id <> t2.id' – vatavale

+1

@vatavale'(group、 name) 'または'(group、name、id) 'を指定します。これを試してみることもできます:http://sqlfiddle.com/#!9/d24012/9 –

1

これは私の作品のように見える:

SELECT DISTINCT t.*, 
     IF(t2.id IS NULL, 0, 1) AS is_duplicate 
FROM tab t 
LEFT JOIN tab t2 ON t.name = t2.name AND t.group = t2.group AND t.id <> t2.id 

http://sqlfiddle.com/#!9/d24012/16/0