【问题标题】:MySQl GROUP BY and ORDER BY not doing what I wantMySQl GROUP BY 和 ORDER BY 没有做我想做的事
【发布时间】:2011-03-28 20:42:56
【问题描述】:

我想在对结果进行分组之前对其进行排序,但我似乎无法完成。

我有这个问题:

选择不同的 产品.id, product_number_value.att_value AS product_number, color_number_value.option_code AS color_number, size_value.option_code AS size_code, size_value.option_position AS size_position 从 产品 INNER JOIN product_attribute_relational AS product_number_relational ON product_number_relational.product_id = product.id INNER JOIN product_att_varchar AS product_number_value ON product_number_relational.product_att_id = product_number_value.product_att_id INNER JOIN product_attribute_relational AS color_number_relational ON color_number_relational.product_id = product.id INNER JOIN product_att_select AS color_number_select ON color_number_relational.product_att_id = color_number_select.product_att_id INNER JOIN attribute_option_value AS color_number_value ON color_number_select.att_value = color_number_value.option_id INNER JOIN product_attribute_relational AS size_relational ON product.id = size_relational.product_id INNER JOIN product_att_select AS size_select ON size_relational.product_att_id = size_select.product_att_id INNER JOIN attribute_option_value AS size_value ON size_select.att_value = size_value.option_id 在哪里 product_number_relational.att_id = 1 AND color_number_relational.att_id = 2 AND size_relational.att_id = 3 AND product.id IN (365, 366, 367, 368, 369, 371, 372, 373, 374) 订购方式 product.id ASC

结果如下表:

id product_number color_number size_code size_position 365 F23740 311 S 24 366 F23740 311 M 25 367 F23740 311 L 26 368 F23740 311 XL 27 369 F23740 311 XS 23 371 F23745 213 小号 24 372 F23745 213 M 25 373 F23745 213 L 26 374 F23745 213 XL 27

如果我按 product_number、color_number 分组,我会得到 id 365 和 371。
但我想获得 id 369 和 371,因为我希望结果在分组之前先按 size_position 排序。

我真的不知道如何完成这项工作?!??

有人可以帮我吗?

谢谢!

【问题讨论】:

  • 你能解释一下结果应该是什么样子吗?
  • 谢谢大家,我用 php 循环遍历“未分组”数据解决了这个问题。这才是真正的禁食方式。再次感谢!

标签: mysql group-by sql-order-by


【解决方案1】:

这是在分组查询中使用非分组列的问题。一般来说,这是要避免的。一些数据库引擎会阻止您这样做,因为它没有逻辑意义 - 如果我想要一个组的 product.id,但是数据库引擎应该选择哪个,因为单个组有多个选项?

ORDER BY 仅适用于使用 GROUP BY 时的聚合或分组列,但我不确定您是否可以轻松聚合。您正在为组中具有 MIN(size_position) 的行查找 product.id 。我认为为每个组隔离这一行的子查询可能是唯一的方法;我想不出一个简单的方法来解决这个问题。

编辑

在这些情况下,我的直觉总是分两步完成。我不喜欢带有嵌套子查询的庞大查询,只是因为我发现它们不可读。您对规范化架构有一个非常长的查询,所以我不打算在这里分解查询,我可能会犯错误。

查询 1 会将 product_number、color_number 和 MIN(size_position)(按 product_number、color_number 分组)推送到临时表中。

查询 2 将检索临时表中每个 product_number、color_number、size_position 的 product_id。这样您就可以直接针对最小尺寸位置进行连接。

在许多情况下,使用临时表的负面性能被夸大了(不是全部,但对于我过去 10 年在交易应用程序中进行的 99% 的查询来说肯定是这样)。

还有另一种可能性涉及子查询自联接,但架构如此高度规范化,我认为实施起来并不是特别有利。

【讨论】:

    【解决方案2】:

    如果您按 product_number, color_number 分组,则为列 id 返回的值是不确定的(因为它们对于每个 product_number,color_number 对都不相同)。详细解释见here

    所以,您说“我想在对结果进行分组之前对其进行排序”,您能说出为什么要对它们进行分组吗?正是你想从中得到什么。

    编辑:评论后:

    SELECT DISTINCT
    
     product_number_value.att_value AS product_number,
     color_number_value.option_code AS color_number,
     min(size_value.option_position) AS sizePosition
    from ...
    
    group by product_number, color_number order by sizePosition
    

    您将拥有 product_number,但没有 id。

    【讨论】:

    • 我想得到具有相同product_number和color_number的产品,但是因为这些组合有多种尺寸,我只想要最小尺寸的一种组合。我知道排序不是正确的词,因为这不能用 SORT BY 来完成。我明白了。
    【解决方案3】:

    尝试按两列排序:

    ... ORDER BY product.id, size_position ASC
    

    它将首先按 id 排序,然后按 size_position。

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多