2009-12-01 71 views
2

我试图创建一个MySQL语句,它将按照语句本身内计算的值进行排序。我的表是这样的:MySQL按2行的计算值排序

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 

感谢您的帮助!

+2

我知道这没有什么帮助,但是如果你负责数据库,你应该重组它,这样'价格'和'零售是分开的两列......特别是如果那些是只有2个元键。我认为这些元键类型的东西应该只用于更晦涩的“设置”,这样你就不需要运行复杂的查询。 – mpen 2009-12-01 06:58:15

+0

好吧,这是wordpress数据库模式,应该足够通用,可以处理大多数关键值对,几乎可以处理任何与帖子相关的项目。 – 2009-12-01 08:15:50

+0

当然它足够通用:它重新实现列。如果可能的话,使用真实列将仍然是更好的选择。 – 2009-12-01 18:33:54

回答

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 | 
+----+---------+ 
+0

我向一位同事展示了此线程有比我更多的SQL经验,他说你的解决方案是最好的。我试过了,它运行良好,所以谢谢!我只是将“select posts.id”改为“select posts。*”,以便我可以使用所有其他数据。顺便说一下,meta_value不需要是数字,因为减法类型化它(我认为)是正确的。再次感谢! – 2009-12-02 00:57:06

0

编辑:我误解.5您的样本输出含义50美分,同样0.3(0.6)= 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。)

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子句中。

+0

好的,将'pri/ret.ID'的拼写错误修正为'post_id'。 +1 – 2009-12-01 06:56:09

+2

“永远不要在FROM子句中放置多个表” - QUESTION显示所谓的旧ANSI连接。语法(“,”而不是“INNER JOIN”本身并不正确,但最佳实践是避免它出于此处表达的原因:http://stackoverflow.com/questions/128965/is-there-something-wrong -with-joins-that-dont-use-the-join-keyword-in-sql-or-mys – micahwittman 2009-12-01 07:04:44

+0

感谢您对我的提示进行阐述并修复我的错别字:-) – Brimstedt 2009-12-01 10:53:39