I had to create a report for a customer by most sold products in the last month and sorted by parameters they have assigned.
We have three parameters on products: Colour
, Type
and Collection
.
The desired result is to sort products by most sold Collection
, then most sold Colour
, then most sold Type
. The query I have written is monstrous, and I am sure it could be written efficiently.
SELECT a.ID, collection.value as title, colour.value as colour, type.value as type
FROM orderrows oa
JOIN order o ON o.ID = oa.orderID
JOIN products a ON oa.productid = a.ID
JOIN productparameter as collection ON collection.productid = a.ID AND collection.parameterid = 'collection_id'
JOIN productparameter as type ON type.productid = a.ID AND type.parameterid = 'type_id'
JOIN productparameter as colour ON colour.productid = a.ID AND colour.parameterid = 'colour_id'
JOIN
(
SELECT @rowId:=@rowId+1 AS rowId, collection.title
FROM
(
SELECT collection.value as title
FROM orderrows oa
JOIN order o ON o.ID = oa.orderID
JOIN products a ON oa.productid = a.ID
JOIN productparameter as collection ON collection.productid = a.ID AND collection.parameterid = 'collection_id'
WHERE o.orderdate > NOW() - INTERVAL 1 MONTH
GROUP BY collection.value
ORDER BY SUM(oa.productprice * oa.productamount) DESC
) collection,
(
SELECT @rowId:=0
) t2
) as collection_sort ON collection.value = collection_sort.title
JOIN
(
SELECT @rowId:=@rowId+1 AS rowId, colour.title
FROM
(
SELECT colour.value as title
FROM orderrows oa
JOIN order o ON o.ID = oa.orderID
JOIN products a ON oa.productid = a.ID
JOIN productparameter as colour ON colour.productid = a.ID AND colour.parameterid = 'colour_id'
WHERE o.orderdate > NOW() - INTERVAL 1 MONTH
GROUP BY colour.value
ORDER BY SUM(oa.productprice * oa.productamount) DESC
) colour,
(
SELECT @rowId:=0
) t2
) as colour_sort ON colour.value = colour_sort.title
JOIN
(
SELECT @rowId:=@rowId+1 AS rowId, type.title
FROM
(
SELECT type.value as title
FROM orderrows oa
JOIN order o ON o.ID = oa.orderID
JOIN products a ON oa.productid = a.ID
JOIN productparameter as type ON type.productid = a.ID AND type.parameterid = 'type_id'
WHERE o.orderdate > NOW() - INTERVAL 1 MONTH
GROUP BY type.value
ORDER BY SUM(oa.productprice * oa.productamount) DESC
) type,
(
SELECT @rowId:=0
) t2
) as type_sort ON type.value = type_sort.title
WHERE o.orderdate > NOW() - INTERVAL 1 MONTH
GROUP BY a.ID
ORDER BY collection_sort.rowId ASC, colour_sort.rowId ASC, type_sort.rowId ASC