mysql - 仅针对一列的行进行分组

标签 mysql sql

我只想对一列的行使用分组依据,让我解释一下如何操作。

我的查询:-

   SELECT
   m.name AS brand,
   opv.name AS model,
   opv.product_condition AS condition,
   (AVG(opv.final_price + opv.overhead_cost)) AS cost,
   opv.product_color AS color,
   COUNT(m.name) as quantity
   FROM `order` o
   JOIN order_veri AS ov
     ON o.order_id = ov.order_fk
   JOIN order_prod_veri AS opv
     ON ov.order_fk = opv.order_id
   JOIN product AS p
     ON opv.product_id = p.product_id
   JOIN manufacturer AS m
     ON p.manufacturer_id = m.manufacturer_id
   GROUP  BY model,
             product_condition

这是我得到的数据:-

  Brand       |    Model           |    Cost    |    Condition    |  Color   |     Quantity    

  -------------------------------------------------------
  Apple       |    iPhone 5        |    $50.95  |     Used        |  Black   |     2
  Blackberry  |    Blackberry 9900 |    $22.98  |     Used        |  Black   |     2
  Samsung     |    Galaxy S        |    $16.92  |     Used        |  White   |     2
  HTC         |    Rhyme           |    $60.42  |     New         |  Red     |     2
  Google      |    Google Nexus    |    $72.24  |     New         |  Blue    |     2
  Motorola    |    Razr            |    $9.68   |     Used        |  Silver  |     2
  Apple       |    iPad Air        |    $2.74   |     New         |  Silver  |     1

这就是我想要获取数据的方式(或者我希望它如何显示):-

  Brand       |    Model           |    Cost    |    Condition    |  Color   |     Quantity    

  -------------------------------------------------------
  Apple       |    iPhone 5        |    $50.95  |     Used        |  Black   |     2
  Apple       |    iPhone 5        |    $50.95  |     Used        |  White   |     

  Blackberry  |    Blackberry 9900 |    $22.98  |     Used        |  Black   |     3
  Blackberry  |    Blackberry 9900 |    $22.98  |     Used        |  White   |     
  Blackberry  |    Blackberry 9900 |    $22.98  |     Used        |  Black   |     

  HTC         |    Rhyme           |    $60.42  |     New         |  Red     |     2
  HTC         |    Rhyme           |    $60.42  |     New         |  Black   |     

  Google      |    Google Nexus    |    $72.24  |     New         |  Blue    |     2
  Google      |    Google Nexus    |    $72.24  |     New         |  Black   |     

  Motorola    |    Razr            |    $9.68   |     Used        |  Silver  |     2
  Motorola    |    Razr            |    $9.68   |     Used        |  White   |     2

  Apple       |    iPad Air        |    $2.74   |     New         |  Silver  |     1

请注意价格如何保持不变,但现在根据数量显示了额外的行,显示相同型号的属性。

我想在这里实现什么:-

现在在颜色列中,由于分组,我没有得到每个模型的不同颜色变化。例如,第一行中 iPhone 5 的数量为 5,但它仅显示这 5 中第一台的颜色。

同样,第二行型号Blackberry 9900,数量为2个,但由于分组时只显示其中1个的颜色有两种不同的颜色(白色和黑色)。

所以我想问的是,是否可以使用 GROUP BY 仅对成本进行分组?

如果您想澄清一些事情或对我想要实现的目标提供更好的解释,请告诉我。

最佳答案

从你的问题中并不清楚你想做什么。很明显,您正在使用令人困惑的非标准 MySQL 扩展 GROUP BY。您应该阅读 MySQL 手册的这一部分。

http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html

关于 SQL 需要记住的一点是,任何问题的困难部分都是精确指定您想要的结果集。

您在评论中说过,您希望显示库存的详细列表,即库存中每个不同的商品占一行。但在该详细列表中,您希望显示该品牌、型号和状况的库存中所有商品的平均成本。这在 SQL 中很棘手,因为您要混合苹果(详细信息)和 Orchard (平均值)。

为此,您需要一个子查询和一个联接。子查询计算出您的平均成本。是这样的:

SELECT  m.name AS brand,
      opv.name AS model,
      opv.product_condition AS product_condition,
      AVG(opv.final_price + opv.overhead_cost) AS cost
 FROM ... the tables in your original ...
 JOIN ...     query in your question.
GROUP BY brand, model, product_condition

然后您需要将此子查询视为虚拟表,并将其连接到您的主查询,如下所示。

SELECT  m.name AS brand,
      opv.name AS model,
      opv.product_condition AS product_condition,
      avg.cost,
      opv.product_color AS color
 FROM ... the tables in your original ...
 JOIN ...    query in your question.
 JOIN ...       in your question
 JOIN (
      SELECT  m.name AS brand,
            opv.name AS model,
            opv.product_condition AS product_condition,
            (AVG(opv.final_price + opv.overhead_cost)) AS cost
       FROM ...  the tables in your original
       JOIN ...     query in your question.
      GROUP BY brand, model, product_condition
      ) AS avg ON (     m.name=avg.name 
                   AND opv.name = avg.model
                   AND opv.product_condition = avg.product_condition)

现在,这看起来像是一个可怕的令人讨厌的查询。从某种意义上来说确实如此,因为您的规范有时需要详细记录,有时需要平均值。但你不应该担心性能;这将是相当不错的。请注意,子查询中有一个 GROUP BY 子句,因为它正在计算平均值。但主查询中没有这样的子句,因为它呈现的是详细记录(单个项目)。

如果您只是寻找汇总结果,您可以有多种选择。如果您试图单独显示不同颜色和条件的元素的平均成本。在这种情况下你想要

 SELECT  m.name AS brand,
         opv.name AS model,
         opv.product_condition AS product_condition,
         AVG(opv.final_price + opv.overhead_cost) AS cost,
         opv.product_color AS color,
    FROM ...
    JOIN ... 
   GROUP BY brand, model, product_condition, color

但也许您想显示商品的平均价格,无论颜色如何。在这种情况下你想要

 SELECT  m.name AS brand,
         opv.name AS model,
         opv.product_condition AS product_condition,
         AVG(opv.final_price + opv.overhead_cost) AS cost,
         GROUP_CONCAT (opv.product_color) AS color,
    FROM ...
    JOIN ... 
   GROUP BY brand, model, product_condition

您是否看到 SELECT ... GROUP BY 中的每个项目在 SELECTGROUP BY 中都被提及,或者受到影响到 SELECT 中的汇总函数(SUMGROUP_CONCAT)?这是 GROUP BY 的标准工作方式。

关于mysql - 仅针对一列的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204658/

相关文章:

mysql - Eloquent ORM - 通过现有关系加入

mysql - 如何避免 MySQL 中的循环触发器依赖

mysql - 需要一些指导来优化 MySQL 中的报告

c# - Entity Framework 生成不同的sql查询

php - codeigniter 添加回引用查询

Joomla—有线 : login does not work after page move

java - 使用 Spring JPA 查询从序列中获取 nextval

php - 如何获取 MySQL 中的所有内容之一

sql - 使用另一张表上多行的数据高效更新一张表上的一行

sql - 具有多列输入的 SQL 函数中的嵌套 Case 表达式