Здесь,
Есть ли вообще сокращение этого 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
Вы можете использовать левые соединения для выполнения этого
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'
Сделайте это одним запросом, с объединением:
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). Если это не так... запрос будет не в порядке. И твой.
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'
Это также будет быстрее, так как вам не придется выполнять каждый из подвыборов для каждой строки в таблице.
Я бы предложил на самом деле удлинить его и не использовать Stock. *, но используя каждое имя столбца. Когда вы используете *, он должен запросить таблицу для получения имен столбцов и немного медленнее.