2011-02-08 18 views
1

fname列の値が類似している行をすべて、次の表から順番に選択したいとします。 「アンナは」「アンナ」、および「ミカエラ」の後に来ると「michaalは」「マイケル」の後に来るので、この表からIOWは、私は、IDS 2,5および7(と行を取得したいです)。重複した列の値が類似する行を検索するMySQL

select *, count(fname) cnt 
from users group by soundex(fname) 
having count(soundex(fname)) > 1; 

が、私はそれを結果をグループ化していますので、私は何を取得したいことはこれです

+----+----------+----------+-----+ 
| id | fname | lname | cnt | 
+----+----------+----------+-----+ 
| 1 | anna  | milski | 2 | 
| 3 | michael | michaels | 3 | 
+----+----------+----------+-----+ 

です:

+----+------------+----------+ 
| id | fname  | lname | 
+----+------------+----------+ 
| 1 | anna  | milski | 
| 2 | anna  | nguyen | 
| 3 | michael | michaels | 
| 4 | james  | bond  | 
| 5 | michaela | king  | 
| 6 | bruce  | smart | 
| 7 | michaal | hardy | 
+----+------------+----------+ 

私はこれまで持っていることはこれです

+----+----------+----------+-----+ 
| id | fname | lname | cnt | 
+----+----------+----------+-----+ 
| 2 | anna | nyugen | 2 | 
| 5 | michaela | king  | 3 | 
| 7 | michaal | hardy | 3 | 
+----+----------+----------+-----+ 

質問に対して変更する必要があるものy?私は "group by"を削除しようとしましたが、結果が変わってしまいました(私は間違っているかもしれませんし、広範囲にテストしていないかもしれません)。

+0

あなたは 'michaela'と' michaal'を両方ともsoundexで入手できますか?私は疑います、あなたのどちらかが手に入るでしょう。あなたがそれを無視することができれば気にするならば、それは問題ではない – Nishant

+0

。 – Gal

答えて

2

私は再読み込み、あなたの最初の質問をし、私は、次の解決策を考え出したてきました:

SELECT * 
FROM users 
WHERE id IN 
     (SELECT id 
     FROM users t4 
       INNER JOIN 
         (SELECT soundex(fname) AS snd, 
           COUNT(*)  AS cnt 
         FROM  users   AS t5 
         GROUP BY snd 
         HAVING cnt > 1 
         ) 
         AS t6 
       ON  soundex(t4.fname)=snd 
     ) 
AND id NOT IN 
     (SELECT MIN(t2.id) AS wanted 
     FROM  users t2 
       INNER JOIN 
         (SELECT soundex(fname) AS snd, 
            COUNT(*)  AS cnt 
         FROM  users   AS t1 
         GROUP BY snd 
         HAVING cnt > 1 
         ) 
         AS t3 
       ON  soundex(t2.fname)=snd 
     GROUP BY snd 
     );

それは過剰に複雑なビットだが、それはあなたが求めてまさに作品と提供します:)

+0

woohoo!それはまさにそれです。あなたは揺れる!どうもありがとうございます。私は本当にそれを感謝します、それは間違いなく仕事で私の$$を保存します:) – Gal

+0

btw私はそれを自分自身でやろうとしましたが、うまくいきません。私は完全に "AND id NOT IN"節を削除して、代わりに "id> min(id)"というクエリを提供していましたので、2番目の行を順番に返すようになりました(これは私が望むもので、 )。それについてどうやって行くのか手がかりはありますか? – Gal

+0

GROUP BYをまったく使用していない場合は、GROUP BYを回して単一の(集約された)行だけを返すことはできません。 'id> MIN(id)'を使うことで、まだ1行しか得られませんが、今回は2行目です。最初の行ではありません。 – GreyCat

0

あなたは何を求めているようです - SOUNDEX(fname)は、文字列全体ではなく、Soundexハッシュを最初の名前からのみ作成します。オプションのいくつかは、あなたが調べることができます:同様の姓、名、またはその両方のいくつかのシンセのハッシュの数を:

 
SELECT *, COUNT(SOUNDEX(CONCAT(fname, lname))) AS cnt 
GROUP BY SOUNDEX(CONCAT(fname, lname)) 
HAVING cnt > 1;

または

SELECT *, COUNT(SOUNDEX(fname)) AS cnt1, COUNT(SOUNDEX(lname)) AS cnt2 
GROUP BY SOUNDEX(fname), SOUNDEX(lname) 
HAVING cnt1 > 1 OR cnt2 > 1 

それはあなたが達成したい何をすべきかに依存します。

+0

これは私の問題の解決策を提供しません、質問をしてください。 – Gal

関連する問題