这可能已经得到了答案,但我已经通读了所有"类似的标题",没有找到一个更好地描述我试图实现的目标的答案。
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等
提前感谢!
您不能在联接中排序,因为这样做毫无意义。但是,您可以根据自己喜欢的任何列对联接的数据集进行排序,即使是联接中使用的列。
根据我对你的问题的理解(这很难,因为截至本文撰写之时,你的查询已经少了一半),你想要的是一个可以像一样实现的次要排序
ORDER BY `inv`.`SKU` ASC, `ItemNumber` ASC
编辑1
在我看来,您试图将太多的需求打包到一个查询中。使用子查询是可能的,但我强烈建议不要使用它们,因为它们在性能方面非常糟糕。在任何情况下,以下是它们的工作方式(您在伪代码中的示例):
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
的一部分,这对人类来说是有意义的,但向DB明确这一点需要耗费大量资源。将SKU作为外键放入ins_imb_1
中是一个非常简单的修复方法,可以加快查询速度,并使数据更稳定,防止数据损坏(在您的情况下,这是一对多关系)。
如果我理解正确,您的ins_imb_1.ItemNumber
列存储了两条信息,即SKU
和sizeletter
。所以,我认为你的JOIN
条件:
ON ins_imb_1.ItemNumber
LIKE CONCAT( inv.SKU, '%' )
应该改为:
ON ins_imb_1.ItemNumber = CONCAT( inv.SKU, inv.sizeletter )