2010-10-11 3 views
1

Последние два параметра - это предложения PHP WHERE и ORDER, они (возможно) не имеют значения здесь.Есть ли лучший способ для этого MySQL CASE SELECT?

fornecedores.nome_emp AS nome_fornecedor, exchange_rates1.rate AS rateEUR_USD, 
exchange_rates2.rate AS rateEUR_AOA, 
CASE produtos.moeda 
WHEN 'AOA' THEN produtos.preco_custo/exchange_rates2.rate 
WHEN 'EUR' THEN produtos.preco_custo 
WHEN 'USD' THEN produtos.preco_custo/exchange_rates1.rate 
END as prc, 

CASE produtos.moeda 
WHEN 'AOA' THEN produtos.preco_venda/exchange_rates2.rate 
WHEN 'EUR' THEN produtos.preco_venda 
WHEN 'USD' THEN produtos.preco_venda/exchange_rates1.rate 
END as pvp 

FROM produtos 
LEFT JOIN fornecedores ON produtos.id_fornecedor = fornecedores.id_fornecedores 
LEFT JOIN exchange_rates AS exchange_rates1 ON exchange_rates1.para = 'USD' 
LEFT JOIN exchange_rates AS exchange_rates2 ON exchange_rates2.para = 'AOA' 
$whereClause $orderClause 

Заранее спасибо: D

ответ

0

Вы упускаете мощь JOIN в MySQL. Вы пытаетесь получить два разных обменных курса (через два разных LEFT JOIN s в ту же таблицу), а затем используйте CASE, чтобы выяснить, какой из них использовать.

Вместо этого присоединяйтесь только к тем тарифам, которые вам действительно нужны! Тогда вам вообще не нужна условная логика.

fornecedores.nome_emp AS nome_fornecedor, exchange_rates.rate, produtos.preco_custo/exchange_rates.rate 
FROM produtos 
LEFT JOIN exchange_rates ON exchange_rates.para = produtos.moeda 

Это предполагает, что есть строка в exchange_rates для EUR, который имеет скорость набора для 1.

+0

черт возьми, я действительно об этом потрудился, но застрял, если бы мы говорили о евро, где мы на самом деле ничего не делаем и оставим это. В моей таблице exchange_rate не было строки для EUR ... Позор мне ... Спасибо VoteyDisciple – eduardev