MySQL按计算值排序2行

时间:2009-12-01 06:22:57

标签: mysql

我正在尝试创建一个MySQL语句,该语句将按语句本身计算的值进行排序。我的表看起来像这样:

posts
+----+-----------+--------------+
| ID | post_type | post_content |
+----+-----------+--------------+
|  1 |      post |        Hello |
|  2 |      post |        world |
+----+-----------+--------------+

postmeta
+---------+----------+------------+
| post_id | meta_key | meta_value |
+---------+----------+------------+
|       1 |    price |         50 |
|       1 |   retail |        100 |
|       2 |    price |         60 |
|       2 |   retail |         90 |
+---------+----------+------------+

我正在尝试计算一个名为储蓄的值(.5ID=1.3ID=2),然后按此排序。这是我到目前为止,但我不知道如何跨2行进行计算(我发现的所有内容都是关于列之间的计算)。

SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wpostmeta.meta_key = 'Price'
AND wposts.post_type = 'post'
ORDER BY wpostmeta.meta_value DESC

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

AFAIK除了使用聚合函数之外,你不能计算“行之间”的东西,在这种情况下这对你没有帮助。

也许您可以加入表格,这样就可以获得一行:

SELECT wposts.*, pri.meta_value / ret.meta_value
FROM $wpdb->posts wposts
INNER JOIN $wpdb->postmeta pri
      ON  pri.post_id = wposts.ID
      AND pri.meta_key = 'price'
INNER JOIN $wpdb->postmeta ret
      ON  ret.post_id = wposts.ID
      AND ret.meta_key = 'retail'
WHERE wposts.post_type = 'post'
ORDER BY pri.meta_value / ret.meta_value

提示:永远不要在FROM子句中放置多个表。

答案 1 :(得分:2)

这是一个简单的连接,它将计算每个帖子的节省,假设meta_value是一种数字数据类型。

select posts.id,
       (retail.meta_value - price.meta_value) * 1.0 / retail.meta_value as savings
  from posts,
       (select * from postmeta where meta_key = 'price') as price,
       (select * from postmeta where meta_key = 'retail') as retail
 where posts.id = price.post_id
   and posts.id = retail.post_id
   and posts.post_type = 'post'
 order by savings;


+----+---------+
| id | savings |
+----+---------+
|  1 | 0.50000 |
|  2 | 0.33333 |
+----+---------+

答案 2 :(得分:0)

编辑:我误解了.5的样本输出为50美分,同样为.3 = 30 = 90 - 60,而不是你得到的百分比(100 - 50) / 100和(90 - 60)/ 90.也许你仍会发现这有用,但它没有回答问题。

SELECT wposts.ID,
  SUM(wpostmeta.meta_value * (CASE
    WHEN wpostmeta.meta_key = 'price' THEN -1
    ELSE 1)
  ) AS savings
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
WHERE wposts.ID = wpostmeta.post_id
AND wposts.post_type = 'post'
GROUP BY wposts.ID;

关键是对meta_values求和,但是翻转价格的符号,这样你实际上得到零售减去价格,按每个ID分组,因此聚合函数SUM独立地处理每个组。然而,在这里做所有这些逻辑是否聪明是一个不同的问题。 :)

(您可能需要调整MySQL的这种语法。)