Mysql-запрос для поиска строк на основе подстроки left () и столбца max ()

0

Если имеется следующий набор данных:

Fqdn         RefQty
abcde.com    25
abcdz.uk     10
abcdf.es     15
bcdef.fr     30
bcdeg.de     25
bcdeh.ch     50

В MySQL, как выбрать, чтобы иметь Fqdn, где LEFT (Fqdn, 4) имеет MAX (RefQty)? Я могу найти LEFT (Fqdn, 4) с MAX (RefQty), но при выборе Fqdn я не получаю правильный Fqdn? В этом случае я бы ответил:

Fqdn
abcde.com
bcdeh.ch

Это казалось тривиальным, но почему-то я застрял на нем несколько часов. Помощь была бы оценена.

Теги:
select

2 ответа

0
Лучший ответ

Найдите максимальные значения для обрезанных строк во внутреннем запросе и используйте эти подсчеты во внешнем запросе во время соединения.

SELECT T.Fqdn
FROM
YOUR_TABLE T
INNER JOIN
(SELECT LEFT(Fqdn, 4) Fqdn_Trim, MAX(RefQty) as MAX_COUNT
FROM YOUR_TABLE
GROUP BY LEFT(Fqdn, 4)) A
ON LEFT(T.Fqdn, 4) = A.Fqdn_Trim AND T.RefQty = A.MAX_COUNT
ORDER BY T.RefQty DESC;
  • 0
    Спасибо, Ваши. При первом запуске я думал, что результаты были не в порядке, так как они были «неполными», глядя на первые ~ 100, но затем я добавил «order by t.RefQty desc» и подтвердил, что результат в порядке. На строке 250 КБ я получаю результирующий набор данных (120 КБ) за 3,5 секунды. Большое спасибо за помощь.
  • 0
    Спасибо за подтверждение! Я добавил предложение ORDER BY для полноты.
0

Одним из решений является использование левого соединения с самим собой: он ищет все Fqdns, у которых нет другой строки с тем же Fqdn, но с более высоким RefQty. Это должны быть строки с наивысшим значением RefQty:

SELECT
  t1.Fqdn
FROM
  mytable AS t1 LEFT JOIN mytable AS t2 ON (LEFT(t1.Fqdn, 4) = LEFT(t2.Fqdn, 4) AND 
                                            t1.RefQty < t2.RefQty)
WHERE
  t2.Fqdb IS NULL
  • 0
    Спасибо Мартин. Выглядело многообещающе как простое решение, но при запуске SQL «EXPLAIN» я получаю «Диапазон проверен для каждой записи (индексная карта: 0x8); Не существует» и получаю 227332 строки для каждого совпадения, что делает запрос слишком длинным для выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню