【问题标题】:ORDER BY within an INNER JOIN?ORDER BY 在 INNER JOIN 中?
【发布时间】:2012-02-24 15:59:08
【问题描述】:

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

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(large),但 ItemNumber 有不同的尺寸(由最后一个字母表示),因此有时价格也不同(因为我们的较大尺寸会加价。)

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

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

提前致谢!

【问题讨论】:

  • 您的 SQL 看起来无效。 “INNER JOIN”之后不应该有什么吗?最后的acs不应该是asc吗?
  • 无效的 SQL 你可能在复制时遗漏了一些东西
  • 哎呀,我复制到记事本格式化,一定是意外删除了一个块!
  • 我真的不明白您在这里要做什么...如果您的尺寸对查询很重要,为什么不将它们包含在 group by 中?
  • 它们的意义在于我想要内部加入时的第一个可用价格(通常应该是 ABC123L),然后我使用 php 在下拉菜单中显示尺寸。

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


【解决方案1】:

您不能在联接中进行排序,因为这样做没有意义。但是,您可以按您喜欢的任何列对连接的数据集进行排序,即使是在连接中使用的列。

根据我对您的问题的理解(这很难,因为您的查询在撰写本文时丢失了一半),您想要的是可以像这样实现的二级排序

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(在您的情况下是一对多的关系)。

【讨论】:

  • 很抱歉,我已经更新并尝试过了,但仍然让 ItemNumbers 出现故障(因此有时是加价!)
  • 嗯,谢谢,我没有能力标准化表格,而不是我的数据库:(问题是我只需要一次价格(最低价格),在上面的例子中我得到' ABC109XX = 17.45' 当 'ABC109L' 和 'ABC109S' 等应该是 $15.95
  • 除非你说重组我的查询以获取所有儿童(尺寸)的价格,然后通过 php 使用最低的!这可能更有效吧?
  • 是的,这样会更有效率。问题是,您要求 SQL 在一个查询中做 2 件事,而这根本无法做到。要么将所有结果按 2 个值排序以得到一个可供 PHP 处理的列表,要么将作业拆分为 2 个查询,要么解决问题并获得无效且缓慢的解决方案。
【解决方案2】:

如果我理解正确,您的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 ) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2013-02-09
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多