我正在尝试创建一个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 |
+---------+----------+------------+
我正在尝试计算一个名为储蓄的值(.5
为ID=1
,.3
为ID=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
感谢您的帮助!
答案 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的这种语法。)