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

时间:2016-04-01 21:24:03

标签: mysql function loops select count

我在构建/使用循环时遇到问题,以了解产品在购物会话中按特定条件(或组合)排名的频率。

这就是我在我的数据库中的例子:

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权限,所以我无法使用某个程序或功能。

  

编辑:

  1. 如果我使用Session(Session3)扩展我的测试数据库,则列 Price_countWhenCheapest和PriceQuality_countWhenHighest don't 计数超过1(看输出)。
  2. 我有一个名为Customer的单独表,其中包含有关Session的更多信息。例如。该会话的客户年龄或性别。如何将其加入到输出中:
    2.1。过滤(可能通过WHERE语句)仅有男性的会话#39;客户
    2.2。在例如内添加(子)计数Price_countWhenCheapest命名' Price_countWhenCheapest_male'了解有多少男性顾客参加了产品最便宜的会议(对于年龄为25岁的客户,也可能是Price_countWhenCheapest_25)
  3. 添加了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
    

1 个答案:

答案 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中删除这些列。