У меня есть 2 таблицы, таблица ONE состоит из category_id
где каждый имеет свой собственный уникальный атрибут name
и каждый product_id
будет уникальным в этой таблице без дубликатов.
Таблица TWO состоит из уникального product_id
как и таблица ONE, и rank
основанный на наибольшей amount
.
Таблица: ОДИН
+--------+---------+------------+--------+
| brd_id | cat_id | product_id | name |
+--------+---------+------------+--------+
| 1 | 1 | 333 | w |
| 2 | 1 | 444 | w |
| 3 | 1 | 555 | w |
| 4 | 2 | 666 | y |
| 5 | 2 | 777 | y |
| 6 | 3 | 888 | t |
+--------+---------+------------+--------+
Таблица: ДВА
+--------+---------+------------+--------+--------+
| new_id | type | product_id | rank | amount |
+--------+---------+------------+--------+--------+
| 1 | all | 333 | 1 | 80 |
| 2 | all | 444 | 2 | 70 |
| 3 | all | 555 | 3 | 60 |
| 4 | all | 666 | 4 | 50 |
| 5 | all | 777 | 5 | 40 |
| 6 | all | 888 | 6 | 30 |
+--------+---------+------------+--------+--------+
То, что я хочу, - показать name
из таблицы ONE только один раз на основе суммы из таблицы TWO WHERE в таблице. ONE product_id
имеет тот же cat_id
.
Этому я смог достичь, используя этот запрос, в основном прямо из базы данных, поэтому поля различаются:
SELECT DISTINCT 'cat'.'brand_name'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p'
ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%'
AND 'cat_p'.'rank' <= 16
ORDER BY 'cat_p'.'rank' ASC
ПРОБЛЕМА
Я получаю дубликаты имен, поэтому я использовал DISTINCT
который в конце игнорирует повторяющиеся значения.
Я хочу рассчитать amount
которой product_id
из таблицы ONE является таблицей IN TWO AND, где у них одинаковая category_id в таблице ONE.
ОЖИДАЕМЫЙ ВЫХОД
+---------+--------+
| cat_id | name | amount
+---------+--------+
| 1 | w | 210
| 2 | y | 90
| 3 | t | 30
+--------+---------+
Надеюсь, это имеет смысл. СПАСИБО
Попробуйте следующее:
SELECT 'cat'.'brand_name', 'cat_p'.'amount', SUM('cat_p'.'amount') AS 'sum_amount'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p' ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%' AND 'cat_p'.'rank' <= 16
GROUP BY 'cat'.'brand_name'
ORDER BY 'sum_amount' DESC, 'cat'.'brand_name'
Обратите внимание на разницу в количествах между суммой и sum_amount, где находятся дубликаты. Возможно, вам придется увеличить ранг и, возможно, добавить LIMIT до конца.
У меня нет скрипки для работы, но я думаю, что это правильно.
Это МОЖЕТ иметь опечатки.
Общая идея заключается в том, что мы делаем это в первую очередь. Затем, как только мы получим отдельный, мы получим SUM из отдельных элементов из вторичной таблицы. Причина, по которой мы это делаем, заключается в том, что в противном случае SUM (если это делается внутри) объединит несколько записей и получит слишком высокую сумму.
SELECT A.CAT_ID, A.BRAND_NAME,
(SELECT SUM(AMOUNT) FROM ps_product_custom_statistics_weekly P WHERE P.ID_PRODUCT=A.ID_PRODUCT) FROM
(
SELECT DISTINCT 'cat'.'cat_id', 'cat'.'brand_name', 'cat_p'.'rank'
FROM 'ps_product_brand' AS 'cat'
INNER JOIN 'ps_product_custom_statistics_weekly' AS 'cat_p'
ON 'cat_p'.'id_product' = 'cat'.'id_product'
WHERE 'cat_p'.'type' LIKE '%all%'
AND 'cat_p'.'rank' <= 16
GROUP BY 'cat'.'cat_id', 'cat'.'brand_name'
) A
ORDER BY A.RANK