我认为我的问题更多是关于数学而不是MySQL。
下订单可以属于三种可能的服务之一(例如A,B,C)。用户有前。 100个已下订单(例如服务A的30个,服务B的40个和服务C的30个)。下订单具有“属性”引用(某些订单属于同一属性引用,有些则不属于)。
我需要为一个特定用户计算“ 每个列表订购的平均服务数量(唯一属性参考)”。此值为0到3(例如1.4)。
例如,如果用户订购了3个有关“属性X”的订单(并且没有订购其他属性),而这是服务A,服务A和服务C的订单-平均值将为2(他订购了2种服务类型以获得相同的属性参考。
样本数据:
CREATE TABLE IF NOT EXISTS `orders` (
`id` int(6) NOT NULL,
`user_id` int(6) NOT NULL,
`reference` varchar(64) NOT NULL,
`service_type` varchar(16) NOT NULL
);
INSERT INTO `orders` (`id`, `user_id`, `reference`, `service_type`) VALUES
('4', '66', 'Blue house', 'serviceA'),
('2', '66', 'Blue house', 'serviceB'),
('5', '66', 'Blue house', 'serviceB'),
('6', '66', 'Blue house', 'serviceC'),
('1', '66', 'Red house', 'serviceA'),
('3', '66', 'Red house', 'serviceA'),
('7', '66', 'Green house', 'serviceC')
在此示例中:用户订购了3个独特的服务以供“蓝房子”参考,1个独特的服务 为“红房子”提供1个独特的服务,为“绿房子”提供参考。 我需要知道每个唯一列表的平均订购服务数 (不是每个列表的平均值,平均-所有这些数据只有一个值)。 因此,我们在这里为用户提供了3个唯一的引用(蓝色,红色,绿色的房子),并且知道如何 每个参考都分配了许多独特的服务。如何获得平均值?
我需要通过计算得出的预期输出:一个值,大约为1.7(我不知道此示例的实际值,因为我不知道如何数学计算)。这意味着用户在所有订单中的整个期间内平均订购了1.7(从3种可用服务)中获得唯一属性参考平均。
我可以毫无问题地获得用户总订单,具有唯一属性引用的用户总订单,但是我不明白如何在不使用PHP进行大量请求和数学计算的情况下计算所需的东西。
例如,获取具有唯一订单参考的订单计数(在下面的示例中为3):
SELECT COUNT(distinct reference) as total_orders FROM orders WHERE user_id = 66;
但是我不知道下一步该怎么做。
答案 0 :(得分:1)
如果我正确理解,则需要两个级别的GROUP BY
。在内部层次上,每个清单需要不同数量的服务(蓝色房屋= 3,红色房屋= 1,绿色= 1)。在外部,您可以计算出3、1:1的平均值:
SELECT userid, AVG(service_type_count) AS avg_service_type_per_listing
FROM (
SELECT userid, reference, COUNT(DISTINCT service_type) AS service_type_count
FROM orders
GROUP BY userid, reference
) AS x
GROUP BY userid
答案 1 :(得分:0)
这是一个猜测,子查询通过用户和引用来标识不同的服务,而外部查询得出平均值。
drop table if exists t;
CREATE TABLE t (
`id` int(6) NOT NULL,
`userid` int(6) NOT NULL,
`reference` varchar(64) NOT NULL,
`service_type` varchar(16) NOT NULL
);
INSERT INTO t (`id`, `userid`, `reference`, `service_type`) VALUES
('1', '66', 'Red house', 'serviceA'),
('2', '66', 'Blue house', 'serviceB'),
('3', '66', 'Red house', 'serviceA'),
('4', '66', 'Blue house', 'serviceA'),
('5', '66', 'Blue house', 'serviceB'),
('6', '66', 'Blue house', 'serviceC'),
('7', '66', 'Green house', 'serviceC');
select s.userid,
sum(s.distinctservice_types) distinctservice_types,
sum(s.distinctservice_types) / 3 avgs
from
(
select userid,reference,count(Service_type) countservice_types,
count(distinct service_type) distinctservice_types
from t
group by userid,reference
) s
group by s.userid
;
+--------+-----------------------+--------+
| userid | distinctservice_types | avgs |
+--------+-----------------------+--------+
| 66 | 5 | 1.6667 |
+--------+-----------------------+--------+
1 row in set (0.00 sec)