Оптимизация запроса MySQL

#mysql #optimization

#mysql #оптимизация

Вопрос:

У меня есть две таблицы 1. категория 2. таблицы продуктов.Я хочу, чтобы общее количество продуктов в категории, общее количество субпродуктов в категории с автором, который последним создал продукт или субпродукт в разделе product вместе с датой создания.

Мой запрос работает, как показано ниже:

 SELECT c.category_id,c.title,c.type,c.alias,
    (SELECT COUNT(product_id) 
     FROM products 
     WHERE parent_type='main' 
     AND category_id=c.category_id 
     AND is_active=1
    ) as total_main_products,
    (SELECT count(product_id) 
     FROM products 
     WHERE parent_type IN('subtypeL1','subtypeL2','subtypeL3') 
     AND category_id=c.category_id 
     AND is_active=1
    ) as total_sub_products,
    DATE_FORMAT(
        (SELECT FROM_UNIXTIME(created) as update_time 
         FROM products 
         WHERE parent_type='main' 
         AND category_id=c.category_id 
         ORDER BY update_time desc limit 1 
        ),'%b %d,%Y at %r'
    )as last_updated,
    (SELECT user_id
     FROM products 
     WHERE parent_type='main' 
     AND category_id= c.category_id 
     ORDER BY created desc limit 1 
    ) as updated_by 
FROM category c 
WHERE c.type=1 
AND c.is_active=1 
ORDER BY c.created DESC
  

Ищу обсуждение, является ли это правильным и эффективным способом написания запроса или у нас есть какой-либо другой способ получить тот же результат.Я пробовал параметры соединения, но не возвращал правильный результат.

Любая помощь или предложение будут высоко оценены.

Спасибо

Комментарии:

1. Чтобы иметь хоть какую-то надежду на получение помощи, вы должны отформатировать свой запрос — добавить туда несколько переводов строк и отступов

2. Я второй @Bohemian. Я сделал некоторое переформатирование бесплатно. В следующий раз я пришлю вам счет 😉

Ответ №1:

Что-то вроде этого (без последнего updated_by поля) —

 SELECT c.category_id, c.title, c.type, c.alias,
  COUNT(IF(p.parent_type='main' AND p.is_active = 1, p.product_id, 0)) total_main_products,
  COUNT(IF((p.parent_type='subtypeL1' OR p.parent_type='subtypeL2' OR p.parent_type='subtypeL3') AND p.is_active = 1, p.product_id, 0)) total_sub_products,
  FROM_UNIXTIME(MAX(IF(p.parent_type='main', update_time, 0))) last_updated -- add formatting here
FROM category c
  LEFT JOIN products p
    ON p.category_id = c.category_id 
WHERE
  c.type = 1 AND c.is_active = 1
GROUP BY
  p.category_id
ORDER BY
  c.created DESC
  

Комментарии:

1. Здравствуйте, спасибо за ваш ответ, но этот запрос возвращает неверный результат, так как возвращается мой другой запрос объединения

2. Пожалуйста, скажите, что не так. Приведите пример с определениями таблиц, небольшим набором данных и желаемым результатом.