我在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
结果:
但是当我添加分组时,我得到了这个:
代码:
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
结果:
这是不正确的排序!
不知何故,当我对此结果进行分组时,我会在281之前获得 id 280!
但我需要得到:
281 | 1600.00
280 | 2340.00
因此,分组会破坏现有的排序!
答案 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非常有用。 否则,您不应该使用它来获取唯一值。