MYSQL排序函数,取决于使用数据库字段值作为数组键的算术运算

时间:2012-05-10 14:42:27

标签: php mysql cakephp

我有产品表,有2个字段:价格,货币。货币字段中的可能值为1,2,3。 1表示MDL,2表示USD,3表示EUR。我必须以mdl货币的价格对我的产品进行分类。所以我有一个包含费率的数组:

$v = array(1,11.38,15.8);

请用我的查询帮助我,我尝试了类似的东西,但我有错误:

$results = $this->Product
                ->query("SELECT `id`,`price`,`currency` FROM products 
                         ORDER BY price*$v[currency] DESC");

嗯......我会试着通过一个例子来解释。

我的表:

id|price|currency
_________________
1 | 500 | 2
2 | 300 | 3

显示第一个产品价格以美元保存,第二个产品价格以欧元保存。但我必须在MDL valute中对它们进行排序。所以我得到每个值的一系列费率: $rates = array([1] = > 1, [2] => 11.50, [3] => 15.50);

所以我必须按公式price*value rate

的结果订购我的产品

在第一种情况下:500*$rates['currency value from db, in our case 2] = 500 * 11.50等。

提前致谢。

2 个答案:

答案 0 :(得分:3)

由于此问题的扩展示例,我编辑了此查询。 让我们假设货币也存储在某些表格中,比方说currency(如果没有,它应该是无论如何)。

currency应如下所示:

ID        VALUE        CODE
-----------------------------
1         1            USD
2         11.38        EUR
3         15.8         MDL

然后查询应该是:

SELECT p.`id`, p.`price`, p.`price` * c.`value` AS 'ratio' 
FROM products p
LEFT JOIN currency c ON c.`id` = p.`currency`
ORDER BY `ratio` DESC

通过此查询您可以根据产品表中的货币ID从表格货币中选择货币值,最后按配给价格*货币值排序结果。

据我所知,也许您在某些配置中只将货币硬编码为数组,但将货币放入数据库(如果不是)确实会更好。

答案 1 :(得分:3)

你不能使用数据库列名作为数组键,因为mysql是后来的实例而不是php。在php中,您只需生成传递给数据库管理系统的查询字符串 您的查询应如下所示:

$results = $this->Product->query
        (
        "SELECT `id`,`price`,
        CASE `currency` 
            WHEN '1' THEN $v[0]
            WHEN '2' THEN $v[1]
            WHEN '3' THEN $v[2]
        END AS 'ratio'
        FROM products
        ORDER BY price*ratio DESC
        "
        );