INNER JOIN中的ORDER BY?

时间:2012-02-24 15:59:08

标签: mysql sql-order-by inner-join

这可能已经得到了解答但是,我已经阅读了所有“相似的标题”并且没有找到更好地描述我想要达到的目标的答案。

Mysql查询是:

SELECT
      inv.SKU,
      inv.misc1,
      inv.sizeletter,
      inv.has_children,
      ins_imb_1.ItemCustomerPriceLevel,
      ins_imb_1.ItemNumber,
      ins_imb_1.DiscountMarkupPriceRate1 
FROM inv
INNER JOIN 
      ins_imb_1 ON ins_imb_1.ItemNumber 
      LIKE CONCAT( inv.SKU,  '%' ) 
      AND ins_imb_1.ItemCustomerPriceLevel = 'M' 
WHERE inv.parent_sku = '' 
      AND inv.store_quantity > 0 
      AND inv.SKU LIKE  'ABC%' 
      AND inv.visible =  'Y' 
GROUP BY inv.SKU
ORDER BY inv.SKU ASC

它返回的结果是:

SKU     sizeword    sizeletter  has_children    ItemCustomerPriceLevel  ItemNumber  DiscountMarkupPriceRate1   
ABC107  NULL            L           Y                   M               ABC107L             15.95
ABC108  NULL            L           Y                   M               ABC108S             15.95
ABC109  NULL            L           Y                   M               ABC109XX            17.45

sizeletter对于所有项目显示为L(大)但ItemNumber具有不同的大小(由最后一个字母表示),因此有时会有不同的价格(因为我们的较大尺寸会得到标记。)

我可以做些什么来确保我的内部联接按照可用的顺序进行? (字母顺序通常是L,M,S,X等)

所以ItemNumber总是以L结尾,除非没有,在这种情况下它会尝试M等。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您无法在联接中进行排序,因为这样做没有任何意义。但是,您可以按照您喜欢的任何列来订购已连接的数据集,甚至是连接中使用的列。

从我能理解的你的问题(这很难,因为你的查询在撰写本文时已经缺少一半),你想要的是一个可以像这样实现的二级排序

ORDER BY `inv`.`SKU` ASC, `ItemNumber` ASC

编辑1

在我看来,您尝试将过多的要求打包到一个查询中。您尝试使用子查询可能会做什么,但我强烈建议不要使用它们are dreadful performance-wise。在任何情况下,这是他们的工作方式(您的伪代码示例):

SELECT 
   `SKU`, 
   (SELECT `ItemNumber` FROM `t2` WHERE `ItemNumber` LIKE CONCAT(t1.SKU, '%') ORDER BY `ItemNumber` ASC LIMIT 1) AS 'firstAvailable'
FROM `t1`
ORDER BY `SKU` ASC;

我建议你保留命令,让php在SQL之后进行更具体的排序,因为你必须遍历整个事情。

另外:如果可能的话,我建议对表进行规范化。假设ItemNumber使用SKU的一部分对人类有意义,但是对于数据库来说,这是非常耗费资源的。将SKU作为外键放入ins_imb_1是一个非常简单的修复,使您的查询更快,makes your data more stable against data corruption(在您的情况下,它是一对多的关系)。

答案 1 :(得分:0)

如果我理解正确,您的ins_imb_1.ItemNumber列会存储两条信息,SKUsizeletter。所以,我认为你的JOIN条件:

ON ins_imb_1.ItemNumber 
      LIKE CONCAT( inv.SKU,  '%' ) 

应该是:

ON ins_imb_1.ItemNumber = CONCAT( inv.SKU,  inv.sizeletter )