MySQL GROUP BY с предпочтением - PullRequest
       16

MySQL GROUP BY с предпочтением

3 голосов
/ 16 ноября 2009

возможно ли использовать GROUP BY с предпочтением записей?

Например, у меня есть целая куча контактных данных, которые могут содержать или не содержать всю информацию - в смысле CSV, если могут выглядеть так:

Test User, Address1, Address2, test@test.com  
, , , test@test.com

Если бы я отправил письмо по электронной почте GROUP BY, я бы хотел извлечь более релевантную запись.

Надеюсь, что имеет смысл?

С уважением, Chris

Ответы [ 4 ]

2 голосов
/ 16 ноября 2009

Вы можете использовать функцию агрегирования для получения более «релевантной» записи для каждого электронного письма.
Я думаю, что этот запрос даст вам лучший результат:

SELECT emailAddress, max(concat(fullName,',',address1,',',address2))
FROM table
GROUP BY emailAddress

Он вернет самую богатую строку для каждого адреса электронной почты, но все данные будут возвращены в одной строке (через запятую), поэтому вам придется как-то анализировать ее.
Если производительность не имеет значения, и вы хотите получить нормальный набор результатов в отдельных полях, вы можете использовать одно из них:

SELECT table.emailAddress, fullName, address1, address2 
FROM 
table JOIN 
    (SELECT emailAddress, 
       max(concat(fullName,address1,address2)) as bestRowInOneString
    FROM table
    GROUP BY emailAddress
    ) bestRowsSubQuery 
 ON 
   concat(table.fullname,table.address1,table.address2) = bestRowsSubQuery.bestRowInOneString
   AND table.emailAddress = bestRowsSubQuery.emailAddress
1 голос
/ 16 ноября 2009

Для каждого электронного письма этот запрос выберет запись с большинством установленных полей:

SELECT  *
FROM    (
        SELECT  DISTINCT email
        FROM    mytable
        ) mi
JOIN    mytable mo
ON      mo.id =
        (
        SELECT  id
        FROM    mytable mf
        WHERE   mf.email = mi.email
        ORDER BY
                username IS NULL + address1 IS NULL + address2 IS NULL DESC
        LIMIT 1
        )
0 голосов
/ 16 ноября 2009

Не уверен, что вы имеете в виду, но в некоторых (большинстве?) Диалектах SQL вы можете комбинировать GROUP BY с CASE логикой:

GROUP BY case when col1 = 'x' then col1 else col2 end

(как я уже сказал, я не уверен, действительно ли это для MySql).

РЕДАКТИРОВАТЬ : если это не подходит для MySql, вы всегда можете извлечь этот бит логики

GROUP BY case when col1 = 'x' then col1 else col2 end

в представлении и SELECT из этого представления, GROUP в столбце, содержащем логику, например

select * from
(
   select ....
   , (case ....) as logic_col
   from ...
) x
group by logic_col
0 голосов
/ 16 ноября 2009

GROUP BY SUBSTRING (поле, N);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...