У меня есть SQL-запрос (я использую MariaDB/MySQL), который работает нормально. Но мне интересно, могу ли я упростить/оптимизировать его. Трудность, с которой я сталкиваюсь, связана с COUNT с INNER JOIN. Мне действительно нужен подзапрос IN или вы думаете, что есть способ его устранить?
SELECT a.*
FROM aaa a
INNER JOIN bbb b ON a.field1 = b.field1
WHERE a.yyy = 'yyy' AND b.zzz = 'zzz'
AND a.field1 IN (
SELECT field1
FROM bbb
WHERE xxx = 'x'
GROUP BY field1
HAVING COUNT(field1) <= 5
)
Благодарю вас!
EXPLAIN или получить план выполнения, также укажите результаты в вопросе. Если у вас нет индексов, посетите использовать-индекс-luke.com.
Кроме того, нам нужно увидеть фактический запрос, а не его перефразированную версию.






Ваш запрос может быть максимально хорошим, но вы также можете попробовать присоединиться к подзапросу вместо использования IN.
SELECT DISTINCT a.*
FROM aaa AS a
INNER JOIN bbb b ON a.field1 = b.field1
INNER JOIN (
SELECT field1
FROM bbb
WHERE xxx = 'x'
GROUP BY field1
HAVING COUNT(*) <= 5
) AS bc ON a.field1 = bc.field1
WHERE a.yyy = 'yyy' AND b.zzz = 'zzz'
Мне очень жаль, мой друг, я забыл добавить AND b.zzz = 'zzz' к моему запросу! Мне очень нужно bbb! Я отредактировал свой вопрос, хорошо?
Мне нравится ответ Бармара, но из-за фильтрации b я предлагаю небольшое (?) изменение. (Я перестраиваю таблицы в первую очередь в соответствии с вероятным порядком оптимизатора.)
SELECT DISTINCT a.*
FROM (
SELECT field1
FROM bbb
WHERE xxx = 'x'
GROUP BY field1
HAVING COUNT(*) <= 5
) AS bc
INNER JOIN bbb AS b ON b.field1 = bc.field1
INNER JOIN aaa AS a ON a.field1 = bc.field1
WHERE b.zzz = 'zzz'
AND a.yyy = 'yyy'
Плюс эти индексы:
bbb: INDEX(xxx, field1) -- this order
b: INDEX(field1, zzz) -- either order
a: INDEX(field1, yyy) -- either order
Первые два составных индекса будут «покрывающими».
Основное изменение по сравнению с ответом Бармара заключалось в том, чтобы оставить a.* напоследок.
Если вы хотите продолжить обсуждение этого вопроса, может быть полезно предоставить SHOW CREATE TABLE и EXPLAIN.
Пожалуйста, опубликуйте описание таблицы, объясните план