gpt4 book ai didi

mysql - 循环/每个 SELECT 和 COUNT 没有 PROCEDURE 或 FUNCTION

转载 作者:行者123 更新时间:2023-11-29 21:11:04 25 4
gpt4 key购买 nike

我在构建/使用循环来了解产品在购物 session 中根据特定标准(或组合)排名的频率时遇到问题。

这就是我数据库中的示例:

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 权限,所以我无法使用过程或函数。

EDIT:

  1. 如果我使用 session (Session3) 扩展测试数据库,则列Price_countWhenCheapest 和 PriceQuality_countWhenHighest 没有计数大于 1(查看输出)。
  2. 我有一个名为 Customer 的单独表,其中包含有关 session 的更多信息。例如。该 session 中客户的年龄或性别。我如何将其加入到输出中:
    2.1.过滤(可能通过 WHERE 语句)只有“男性”客户的 session
    2.2.添加一个(子)计数,例如Price_countWhenCheapest 命名为“Price_countWhenCheapest_male”,以了解有多少男性客户参加了产品最便宜的 session (对于 25 岁的客户,可能还包括 Price_countWhenCheapest_25)

添加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

最佳答案

不幸的是 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

尽管如此,它需要多次扫描表,并且不同的部分并不能真正使该查询变得更快。

诀窍是,将最便宜价格和最高价格质量的信息以 1:1 的比例JOIN,这样就可以在不更改组的情况下将其包含在组中。如果您确实需要计数,请使用 SUM() 将其包装起来,就像我对其余部分所做的那样,然后从 group by 中删除这些列。

关于mysql - 循环/每个 SELECT 和 COUNT 没有 PROCEDURE 或 FUNCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36366067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com