2009-12-01 95 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