Я собираюсь попытаться ответить - до сих пор не совсем ясно, что должен делать ваш запрос. Предоставленная вами скрипта не выполняет ваш запрос (из-за упомянутой ошибки GROUP BY @rickJames).
Я полагаю, что вы намереваетесь получить все записи в таблице продуктов для получения списка поставщиков. Вы хотите, чтобы записи, где провайдер равен 0, были в конце этого списка. Вы хотите, чтобы запрос выполнялся быстро.
Вы сможете достичь этого с помощью этого запроса:
SELECT
`products`.*, 1 as no_provider
FROM
`products`
WHERE
`products`.`provider_count` IN
(12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58)
union
SELECT
`products`.*, 2 as no_provider
FROM
`products`
WHERE
`products`.`provider_count` = 0
order by no_provider, provider_count
LIMIT 48
Ваше предельное предложение означает, что если имеется более 48 записей с числом провайдеров> 0, последнее предложение не будет отображаться в вашем наборе результатов.
Конечно, вы могли бы сделать это еще проще:
SELECT
`products`.*
FROM
`products`
WHERE
`products`.`provider_count` IN
(12,2,3,4,5,6,7,8,9,10,11,13,14,18,19,21,22,42,46,58,0)
ORDER BY provider_count desc