#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. Пожалуйста, скажите, что не так. Приведите пример с определениями таблиц, небольшим набором данных и желаемым результатом.