不正确的分组依据和合并顺序

时间:2014-12-26 10:41:59

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

我在MySQL中加入了几个表 - 其中一个表有许多其他表。 并尝试从一个中选择项目,按另一个表格中的最小值排序。

没有分组似乎是这样的:

代码:

select `catalog_products`.id
     , `catalog_products`.alias
     , `tmpKits`.`minPrice`
from `catalog_products`
left join `product_kits` on `product_kits`.`product_id` = `catalog_products`.`id`
left join (
    SELECT MIN(new_price) AS minPrice, id FROM product_kits GROUP BY id
) AS tmpKits on `tmpKits`.`id` = `product_kits`.`id`
where `category_id` in ('62')
order by product_kits.new_price ASC

结果:

enter image description here


但是当我添加分组时,我得到了这个:

代码:

select `catalog_products`.id
     , `catalog_products`.alias
     , `tmpKits`.`minPrice`
from `catalog_products`
left join `product_kits` on `product_kits`.`product_id` = `catalog_products`.`id`
left join (
    SELECT MIN(new_price) AS minPrice, id FROM product_kits GROUP BY id
) AS tmpKits on `tmpKits`.`id` = `product_kits`.`id`
where `category_id` in ('62')
group by `catalog_products`.`id`
order by product_kits.new_price ASC

结果:

enter image description here

这是不正确的排序!

不知何故,当我对此结果进行分组时,我会在281之前获得 id 280!

但我需要得到:

281 | 1600.00

280 | 2340.00

因此,分组会破坏现有的排序!

2 个答案:

答案 0 :(得分:0)

例如,当您将GROUP BY仅应用于一列时,无法保证其他列中的值始终正确。不幸的是,MySQL允许这种类型的SELECT / GROUPing发生在其他产品上。二,在MySQL中允许的子查询中使用ORDER BY的语法在其他数据库产品(包括SQL Server)中是不允许的。您应该使用一个解决方案,每次执行时都会返回正确的结果。

所以查询将是:

例如,当您将GROUP BY仅应用于一列时,无法保证其他列中的值始终正确。不幸的是,MySQL允许这种类型的SELECT / GROUPing发生在其他产品上。二,在MySQL中允许的子查询中使用ORDER BY的语法在其他数据库产品(包括SQL Server)中是不允许的。您应该使用一个解决方案,每次执行时都会返回正确的结果。

所以查询将是:

   select CP.`id`, CP.`alias`, TK.`minPrice`
    from catalog_products CP
    left join `product_kits` PK on PK.`product_id` = CP.`id`
    left join (
        SELECT MIN(`new_price`) AS "minPrice", `id` FROM product_kits GROUP BY `id`
    ) AS TK on TK.`id` = PK.`id`
    where CP.`category_id` IN ('62')
    order by PK.`new_price` ASC
    group by CP.`id`

答案 1 :(得分:0)

事实是,的群组在MySQL中无法识别顺序。

实际上,我所做的实际上是不好的做法。 在这种情况下,您应该使用distinct和by catalog_products。*

在我看来,当你需要聚合函数的组结果时,group by非常有用。 否则,您不应该使用它来获取唯一值。