Как я могу сократить этот MySQL Query?

0

Здесь,

Есть ли вообще сокращение этого MySQL-запроса? Он должен захватить две разные строки из таблицы PriceRuleDetail из столбца RuleValue на основе правила цены, но используя псевдоним, верните их в одну строку. Он использует подзапросы внутри оператора select, который, как я полагаю, прав, но может быть более простой способ?

Ниже все работает правильно, и я достаточно доволен этим, но мне было интересно, есть ли способ сделать это короче???

SELECT Stock.*, 
    (SELECT PriceRuleDetail.RuleValue
    FROM PriceRuleDetail
    WHERE PriceRuleDetail.Sku = Stock.Sku
    AND PriceRuleDetail.PriceRule = 'RG'
    AND PriceRuleDetail.Quantity = 1) as Price,
    (SELECT PriceRuleDetail.RuleValue
    FROM PriceRuleDetail
    WHERE PriceRuleDetail.Sku = Stock.Sku
    AND PriceRuleDetail.PriceRule = 'RRP'
    AND PriceRuleDetail.Quantity = 1) as WasPrice
FROM Stock, StockCategoryMemberList
WHERE StockCategoryMemberList.Sku = Stock.Sku
AND StockCategoryMemberList.CategoryCode = 'FIRE'

Спасибо заранее.

Andy

Теги:

4 ответа

4
Лучший ответ

Вы можете использовать левые соединения для выполнения этого

 SELECT Stock.*, 
        PRD1.RuleValue as Price, 
        PRD2.RuleValue as WasPrice
FROM 
   Stock INNER JOIN
   StockCategoryMemberList ON StockCategoryMemberList.Sku = Stock.Sku LEFT JOIN 
   PriceRuleDetail PRD1 ON PRD1.Sku = Stock.Sku
                        AND PRD1.PriceRule = 'RG'
                        AND PRD1.Quantity = 1 LEFT JOIN
   PriceRuleDetail PRD2 ON PRD2.Sku = Stock.Sku
                        AND PRD2.PriceRule = 'RRP'
                        AND PRD2.Quantity = 1
WHERE StockCategoryMemberList.CategoryCode = 'FIRE'
  • 0
    Я нашел, что это самый быстрый из всех ответов и, безусловно, самый читаемый. Спасибо большое всем за помощь!
  • 0
    Вы были быстрее ... У меня есть тот же запрос в моем текстовом редакторе.
6

Сделайте это одним запросом, с объединением:

SELECT
   Stock.*, 
   PRD1.RuleValue as Price, 
   PRD2.RuleValue as WasPrice
FROM 
   Stock, 
   StockCategoryMemberList, 
   PriceRuleDetail PRD1, 
   PriceRuleDetail PRD2
WHERE
StockCategoryMemberList.Sku = Stock.Sku
AND StockCategoryMemberList.CategoryCode = 'FIRE'
AND PRD1.Sku = Stock.Sku
    AND PRD1.PriceRule = 'RG'
    AND PRD1.Quantity = 1
AND
    PRD2.Sku = Stock.Sku
    AND PRD2.PriceRule = 'RRP'
    AND PRD2.Quantity = 1

Я сделал то же самое предположение, которое вы сделали (что для одной записи запаса существует только одна цена и только одна WasPrice). Если это не так... запрос будет не в порядке. И твой.

  • 0
    На самом деле это немного удлиняет запрос по количеству строк, но я думаю, что это гораздо более читаемый запрос.
  • 0
    Спасибо за это! В таблице PriceRuleDetail может быть только одна цена, а одна была ценовой записью из-за настройки уникальных ключей и оператора «Количество = 1» (поскольку могут быть разные цены для разных количеств в виде полос). Это выглядит намного лучше, чем у меня! Спасибо!
Показать ещё 2 комментария
2
select s.*, prd1.rulevalue as price, prd2.rulevalue as wasprice
from
  stock s
  inner join stockcategorymemberlist scm
      on s.sku = scm.sku
  inner join priceruledetail prd1
      on prd1.sku = s.sku and prd1.pricerule='RG' and prd1.quantity=1
  inner join priceruledetail prd2
      on prd2.sku = s.sku and prd2.pricerule='RRP' and prd2.quantity=1
where
  s.categorycode='FIRE'

Это также будет быстрее, так как вам не придется выполнять каждый из подвыборов для каждой строки в таблице.

0

Я бы предложил на самом деле удлинить его и не использовать Stock. *, но используя каждое имя столбца. Когда вы используете *, он должен запросить таблицу для получения имен столбцов и немного медленнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню