ЗАКАЗАТЬ ВНУТРЕННЕЕ СОЕДИНЕНИЕ? - PullRequest
0 голосов
/ 24 февраля 2012

Возможно, на это ответили, но я прочитал все «похожие названия» и не нашел ответа, который бы лучше описывал то, чего я пытаюсь достичь.

Запрос 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 голосов
/ 24 февраля 2012

Если я правильно понимаю, в вашем столбце 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 ) 
0 голосов
/ 24 февраля 2012

Вы не можете сортировать в объединении, потому что это бессмысленно. Однако вы можете упорядочить свой объединенный набор данных по любому столбцу, который вам нравится, даже по тем, которые используются в объединениях.

Из того, что я могу понять по вашему вопросу (что сложно, потому что ваш запрос наполовину отсутствует на момент написания этой статьи), вы хотите получить вторичную сортировку, которая может быть достигнута следующим образом

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 выполнять более конкретную сортировку post-SQL, так как вам все равно придется перебирать всю вещь.

Также: я предлагаю по возможности нормализовать таблицу. Предполагая, что ItemNumber использует часть SKU, имеет смысл для человека, но это невероятно ресурсоемко, чтобы сделать его понятным для БД. Вставка SKU в ins_imb_1 в качестве внешнего ключа является довольно простым исправлением, делает ваш запрос быстрее и делает ваши данные более устойчивыми к повреждению данных (в вашем случае это отношение один ко многим) ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...