MySQL сортируется по убыванию - PullRequest
0 голосов
/ 18 октября 2019

Данные таблицы: select firstName, package_id, website from user

Обратите внимание, что в таблице более 30 тыс. Строк.

enter image description here

Я пытаюсь отобразить самый низкий package_id в каждом website, и вот запрос

select firstName, package_id, website from user group by website order by package_id

enter image description here

Должен отображаться самый низкийpackage_id для каждого веб-сайта, но он неверный, например, для значения kahuta он должен возвращать 6, а для Null => 10 и example.com => 9

Ответы [ 2 ]

1 голос
/ 18 октября 2019

С NOT EXISTS:

select u.* from user u
where not exists (
  select 1 from user
  where website <=> u.website and package_id < u.package_id
)

или присоединить таблицу к подзапросу, который возвращает мин package_id для каждого website:

select u.* 
from user u inner join (
  select website, min(package_id) minpackageid
  from user 
  group by website
) g on g.website <=> u.website and g.minpackageid = u.package_id
1 голос
/ 18 октября 2019

Не используйте агрегацию. Используйте фильтрацию:

select u.*
from user u
where u.package_id = (select min(u2.package_id)
                      from user u2
                      where u2.website <=> u.website
                     );

Если производительность является проблемой, вы хотите индекс на user(website). Однако вам следует проверить, используется ли он для <=>. Если нет, попробуйте использовать =, а затем дополнительную логику для значений NULL.

...