Как получить результаты поиска MySQL по Shortest String при группировании? - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть запрос, который я выполняю:

SELECT a.* 
FROM a
GROUP BY a.prefixNumber
ORDER BY LENGTH(a.uniqueName) ASC, a.prefixNumber;

Две или более строки данных могут содержать одинаковые prefixNumber в форме ABC-123, однако они будут иметь уникальное имя для каждого prefixNumber. Я хочу, чтобы uniqueName имел самую короткую длину, но при этом мог группировать по prefixNumber.

Я предполагаю, что что-то происходит, когда я делаю предложение GROUP BY, но я не совсем уверен, так как мои навыки SQL не самые высокие. Я искал вокруг, и я нашел решение Length(a.uniqueName). Это, похоже, не решает мою проблему, так как я все равно получу самое длинное имя для нескольких сценариев.

Soultions?

1 Ответ

1 голос
/ 03 апреля 2019

Я понимаю, что вы хотите удалить дубликаты на prefixNumber, выбрав запись с самой короткой uniqueName.

Я бы использовал NOT EXISTS вместо агрегирования:

SELECT a1.* 
FROM a a1
WHERE NOT EXISTS (
    SELECT 1 
    FROM a a2
    WHERE 
        a2.prefixNumber = a1.prefixNumber 
        AND LENGTH(a2.uniqueName) < LENGTH(a1.uniqueName)
)
ORDER BY a1.prefixNumber

Условие NOT EXISTS использует коррелированный подзапрос, чтобы убедиться, что нет другой записи с таким же prefixNumber и самым коротким uniqueName.


В MYSQL 8.0 вы можете использовать оконные функции, которые обычно более эффективны:

SELECT *
FROM (
    SELECT 
        a.*,
        ROW_NUMBER() OVER(PARTITION BY prefixNumber ORDER BY LENGTH(uniqueName)) rn
    FROM a
) x 
WHERE rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...