2010-08-12 77 views
4

我想在分组之前对结果进行排序,但似乎无法完成。MySQl GROUP BY和ORDER BY不做我想做的事

我有这个疑问:

 
SELECT DISTINCT 
product.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 
FROM 
product 
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 
WHERE 
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) 
ORDER BY 
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 S 24 
372 F23745 213 M 25 
373 F23745 213 L 26 
374 F23745 213 XL 27 

如果我按product_number,color_number我得到ID 和371
但我想要得到编号和371,因为我想在按照size_position对它们进行分组之前先对结果进行排序。

我真的不知道如何做到这一点?!?

有人可以帮我吗?

谢谢!

+0

你能解释一下结果应该是什么样子吗? – Kwebble 2010-08-12 11:58:35

+0

谢谢大家,我用php循环访问'未分组'数据解决了这个问题。这是真正的禁食方式。再次感谢! – Johan 2010-08-16 12:27:04

回答

0

尝试通过两列命令:

... ORDER BY product.id, size_position ASC 

它将由ID排序第一,但随后被size_position。

+0

不完全是我想要的,但谢谢! – Johan 2010-08-12 11:17:56

2

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

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

编辑

我在这些情况下的本能总是做这两个步骤。我不喜欢嵌套子查询的巨大查询,因为我发现它们不可读。你对规范化的模式有很长的查询,所以我不打算试图在这里分解查询,我很可能犯了一个错误。

查询1会将product_number,color_number和MIN(size_position)(按product_number,color_number分组)放入临时表中。

查询2然后将检索temp_table中每个product_number,color_number,size_position的product_id。这样你可以直接对最小尺寸的位置进行连接。

使用临时表的负面表现在许多情况下都是过度使用(并非所有情况,但对于我在过去10年中在交易应用程序中进行的查询中的99%来说)。

还有一种涉及子查询自连接的可能性,但是模式如此严格的标准化,我认为这不会特别有利于实现。

+0

我想我知道你的意思,谢谢你的回复。 – Johan 2010-08-12 11:20:38

1

如果按产品编号color_number进行分组,则为列标识返回的值不确定(因为它们对于每个产品编号,颜色编号对都不相同)。有关详细说明,请参阅here

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

EDIT:

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:后评论。

+0

我想要获得具有相同product_number和color_number的产品,但由于这些组合具有多种尺寸,因此我只想要具有最小尺寸的一种组合。 我知道排序不是正确的词,因为这不能用SORT BY来完成。我明白了。 – Johan 2010-08-12 11:16:57