2012-08-23 75 views
1

如何按product_id分組之前按ap_status的順序排列所有行'n', 'p', 'd', 'c', 'b', 'x'ORDER BY GROUP BY之前的指定訂單

這個查詢訂單正確,當你刪除GROUP BY

SELECT `account_id`, `product_id`, `product_name`, `ap_status`, count(`ap_id`) as `num` 
FROM (accounts_products_view) 
WHERE `account_id` = 13 
/*GROUP BY `product_id`*/ 
ORDER BY FIELD(`ap_status`, 'n', 'p', 'd', 'c', 'b', 'x') desc 

所以我試圖用HAVING觀看一些類似的問題後,但是,這並非本集團之前任

SELECT account_id, product_id, product_name, ap_status, count(ap_id) as num, 
CASE 
WHEN ap_status = 'n' then 1 
WHEN ap_status = 'p' then 2 
WHEN ap_status = 'd' then 3 
WHEN ap_status = 'c' then 4 
WHEN ap_status = 'b' then 5 
WHEN ap_status = 'x' then 6 
END as `order` 

FROM (accounts_products_view) 
WHERE `account_id` = 13 
GROUP BY product_id 
HAVING `order` = MIN(`order`) 

任何建議工作非常感謝

+0

也許您可以使用您的ORDER BY查詢作爲另一個查詢的子查詢,該查詢對其結果使用GROUP BY。或者使用臨時表或某物。 – rocky3000

+0

向我們顯示您的查詢。無論如何,如果你要分組,並應用一個聚合函數,你不需要訂單 –

回答

1

你可能想嘗試:

SELECT *, count(`ap_id`) as `num` FROM (
     SELECT `account_id`, `product_id`, `product_name`, `ap_status`, `ap_id` 
     FROM (accounts_products_view) 
     WHERE `account_id` = 13 
     /*GROUP BY `product_id`*/ 
     ORDER BY FIELD(`ap_status`, 'n', 'p', 'd', 'c', 'b', 'x') desc 
    ) as res GROUP BY product_id 

但請記住它是不正確的!如果使用group by,那麼無論是需要使用聚合函數,例如SUM(),還是在group by中指定字段。在你的例子中,你可能正確檢索的字段是product_id,沒有別的。由於MySQL錯誤或者你不會在這個查詢中得到異常,但是在postgresql中你會得到異常。 如果您有兩行具有相同的product_id和不同的ap_status,理論上您無法說出查詢應返回哪一行。我想你已經知道在MySQL中第一行將被返回,這就是爲什麼你要在執行group by之前排序的原因。請記住,這是不正確的,非常黑客。

+0

這個工作完美,然而,'count(ap_id)'由於'group by'在外面導致錯誤,是一種獲得這種方式的方式?我試着把它移到外面的'SELECT'上,但是這個錯誤也是謝謝:) – JPickup

+0

我在'SELECT'內部添加了'SELECT *,count(ap_id)'和'ap_id',並且這個工作原理沒有錯誤。它可能是hackish,但我不會告訴你是否不! – JPickup

+0

@JPickup啊對,我的壞 - 我沒有看到數(ap_status),我會更新答案 – mkk