我在构建/使用循环时遇到问题,以了解产品在购物会话中按特定条件(或组合)排名的频率。
这就是我在我的数据库中的例子:
Session | Product | Price | PriceQuality | Promotion | Exclusivity
-----------------------------------------------------------------------------------------------
Session1 | ProductA | 50 | 7 | Yes | No
Session1 | ProductB | 40 | 6 | No | Yes
Session1 | ProductC | 30 | 8 | No | No
Session1 | ProductD | 20 | 9 | Yes | No
Session2 | ProductA | 30 | 6 | No | Yes
Session2 | ProductB | 40 | 7 | No | Yes
Session2 | ProductC | 20 | 9 | No | No
Session2 | ProductD | 50 | 8 | Yes | No
我想要的是为每个存在的标签提供这种输出:
Product | Price_countWhenCheapest | PriceQuality_countWhenHighest | Promotion_countWhenYes | Exclusivity_countWhenYes
-----------------------------------------------------------------------------------------------------------------------------------------
ProductA | 0 | 0 | 1 | 1
ProductB | 0 | 0 | 0 | 2
ProductC | 1 | 1 | 0 | 0
ProductD | 1 | 1 | 2 | 0
注意:因为我没有(云)数据库的SUPER权限,所以我无法使用某个程序或功能。
编辑:
添加了Session3以测试数据库:
Testrow_id Session Product Price PriceQuality Promotion Exclusivity
1 Session1 ProductA 50 7 Yes No
2 Session1 ProductB 40 6 No Yes
3 Session1 ProductC 30 8 No No
4 Session1 ProductD 20 9 Yes No
5 Session2 ProductA 30 6 No Yes
6 Session2 ProductB 40 7 No Yes
7 Session2 ProductC 20 9 No No
8 Session2 ProductD 50 8 Yes No
9 Session3 ProductA 30 6 No Yes
10 Session3 ProductB 40 7 No Yes
11 Session3 ProductC 20 9 No No
12 Session3 ProductD 50 8 Yes No
现在输出:
Product Price_countWhenCheapest PriceQuality_countWhenHighest Promotion_countWhenYes Exclusivity_countWhenYes
ProductA 0 0 1 2
ProductB 0 0 0 3
ProductC 1 1 0 0
ProductD 1 1 3 0
答案 0 :(得分:0)
不幸的是,MySQL不支持我通常使用的很多东西,因此 我不确定这是否有效,但您可以尝试以下声明:
SELECT
Product,
CASE WHEN b.Product IS NOT NULL THEN 1 ELSE 0 END AS Price_countWhenCheapest,
CASE WHEN c.Product IS NOT NULL THEN 1 ELSE 0 END AS PriceQuality_countWhenHighest,
SUM(CASE WHEN Promotion = 'Yes' THEN 1 ELSE 0 END) AS Promotion_countWhenYes,
SUM(CASE WHEN Exclusivity = 'Yes' THEN 1 ELSE 0 END) AS Exclusivity_countWhenYes
FROM tablename a
LEFT JOIN (
SELECT DISTINCT Product
FROM tablename
WHERE Price = (SELECT MIN(Price) FROM tablename)
) b USING ( Product )
LEFT JOIN (
SELECT DISTINCT Product
FROM tablename
WHERE PriceQuality = (SELECT MAX(PriceQuality) FROM tablename)
) c USING ( Product )
GROUP BY Product, Price_countWhenCheapest, PriceQuality_countWhenHighest
但是,它需要不止一次扫描表格,并且不同的部分并不能真正快速地进行此查询。
诀窍在于JOIN
关于最便宜的价格和最高价格质量的信息,产品之间的比例为1:1,因此可以通过不更改组来包含在组中。如果您确实需要计数,请使用SUM()
将其包装起来,就像我对其余的一样,并从group by中删除这些列。