I want to select from the following table all the rows which have similar values in the fname column as the first in their order. IOW from this table I want to retrieve rows
I've re-read your initial question and I've came up with the following solution:
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
);
It's a bit over-complicated, but it works and delivers exactly what you asked for :)
You seem to get what you're asking for - SOUNDEX(fname) would make Soundex hashes only from first name, not whole string. A few of options you can investigate:
SELECT *, COUNT(SOUNDEX(CONCAT(fname, lname))) AS cnt GROUP BY SOUNDEX(CONCAT(fname, lname)) HAVING cnt > 1;
or
SELECT *, COUNT(SOUNDEX(fname)) AS cnt1, COUNT(SOUNDEX(lname)) AS cnt2
GROUP BY SOUNDEX(fname), SOUNDEX(lname)
HAVING cnt1 > 1 OR cnt2 > 1
It depends on what do you want to achieve: count of similar first name, last names or some synth hash of both.