这可能已经得到了解答但是,我已经阅读了所有“相似的标题”并且没有找到更好地描述我想要达到的目标的答案。
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等。
提前致谢!
答案 0 :(得分:0)
您无法在联接中进行排序,因为这样做没有任何意义。但是,您可以按照您喜欢的任何列来订购已连接的数据集,甚至是连接中使用的列。
从我能理解的你的问题(这很难,因为你的查询在撰写本文时已经缺少一半),你想要的是一个可以像这样实现的二级排序
ORDER BY `inv`.`SKU` ASC, `ItemNumber` ASC
在我看来,您尝试将过多的要求打包到一个查询中。您尝试使用子查询可能会做什么,但我强烈建议不要使用它们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
列会存储两条信息,SKU
和sizeletter
。所以,我认为你的JOIN
条件:
ON ins_imb_1.ItemNumber
LIKE CONCAT( inv.SKU, '%' )
应该是:
ON ins_imb_1.ItemNumber = CONCAT( inv.SKU, inv.sizeletter )