MySQL отличные значения group_concat - PullRequest
1 голос
/ 20 октября 2011

У меня есть несколько учетных записей пользователей, с которыми мне нужно создавать ассоциации на основе почтового индекса DOB и т. Д.

У меня следующий запрос:

SELECT DISTINCT CONCAT_WS(' , ' ,a.user_id , GROUP_CONCAT( b.user_id SEPARATOR ' , ' ) )
FROM tbl_users_details a,
tbl_users_details b
WHERE a.user_id != b.user_id
AND a.date_of_birth = b.date_of_birth
AND a.postcode = b.postcode
AND LEVENSHTEIN_RATIO( a.last_name , b.last_name ) > 60
GROUP BY a.user_id

Чтобы продемонстрировать мои требования ...

Если счета 1 5 9 и 12 соответствуют критериям (т. Е. Это одни и те же люди)

Я получу 4 результата в формате

1  , 5 , 9 , 12
5  , 1 , 9 , 12
9  , 1 , 5 , 12
12 , 1 , 5 , 9

Мне бы очень хотелось, чтобы 1,5,9,12

Любые указатели были бы великолепны.

спасибо людям.

Ответы [ 4 ]

2 голосов
/ 20 октября 2011

Можете ли вы быть более четким в ваших требованиях?

В любом случае попробуйте использовать подзапрос, например

Select CONCAT (user.i,',)
from 
(Select Distinct ...... --- ur old code ---- )

Спасибо, Шанмугам

1 голос
/ 20 октября 2011

В общем, я бы сделал что-то вроде этого:

SELECT GROUP_CONCAT( user_id )
FROM tbl_users_details
GROUP BY date_of_birth, postcode, last_name

, но проверка расстояния Левенштейна делает это проблематичным, поскольку на самом деле нет никакой гарантии, что LEVENSHTEIN_RATIO(x, y) > n и LEVENSHTEIN_RATIO(y, z) > n подразумевают LEVENSHTEIN_RATIO(x, z) > n. (Например, что если один из ваших пользователей был назван «Андерсон», другой «Аддисон» и третий «Аткинсон»?) Возможно, вы захотите использовать другой метод оценки сходства, который фактически отображает имена в отдельные группы, например soundex или метафон :

SELECT GROUP_CONCAT( user_id )
FROM tbl_users_details
GROUP BY date_of_birth, postcode, SOUNDEX(last_name)
0 голосов
/ 20 октября 2011

считай, я понял ....

SELECT  GROUP_CONCAT(ida ORDER BY ida ASC SEPARATOR ' , ') ids
FROM
(SELECT LEAST(a.user_id, b.user_id ) idbase,a.user_id ida, b.user_id idb
FROM apollo.tbl_users_details a,
apollo.tbl_users_details b
WHERE a.user_id != b.user_id
AND a.date_of_birth = b.date_of_birth
AND a.postcode = b.postcode
AND LEVENSHTEIN_RATIO( a.last_name , b.last_name ) > 60
GROUP BY a.user_id) as sub
GROUP BY idbase;

Запуск с полным набором данных для проверки ..

0 голосов
/ 20 октября 2011

Вы можете включить предложение ORDER BY в функцию GROUP_CONCAT -

... GROUP_CONCAT(b.user_id SEPARATOR ' , ' ORDER BY b.user_id)
...