2014-06-12 85 views
0

目前我正在設計一個系統,以便公司及其各個部門查看階段訂單。 http://sqlfiddle.com/#!2/91cd6aMySQL加入,最近一次分組,每個編號限制爲1個結果

o.id Order# om.id  status 
-- ----  --   ---- 
1 1  2   Delivered 
3 2   4   Order Received 
3 2   4,5  Order On Hold (parts needed) 
4 2   4,5,6  Ready for Delivery 
5 2   4,5,6,2 Delivered 
6 3   2   Delivered 

我的期望:我對在訂單管理表存儲逗號分隔「狀態」,因此我們可以跟蹤遞歸(什麼員工做了什麼日子什麼,等等)

SQL小提琴這樣做結果會是這樣的:

3 => [Order: 3, Status: 2] 
2 => [Order: 2, Status: 2,4,5,6] 
1 => [Order: 1, Status: 2] 

但是,我目前正在得到每個結果;

3 => [Order: 3, Status: 2] 
2 => [Order: 2, Status: 2,4,5,6] 
2 => [Order: 2, Status: 4,5,6] 
2 => [Order: 2, Status: 5,6] 
1 => [Order: 1, Status: 2] 

這是我使用的當前查詢:

"SELECT * FROM orders LEFT JOIN orders_mgmt ON orders_mgmt.om_order_id = orders.orders_ID WHERE orders_distributor_ID = '$dashID' AND orders_process_status != '2' ORDER BY orders_mgmt.om_timestamp DESC" 
+0

你想用這種表結構實現它很難,你是否認爲2個相關的表格是1:N的關係?你可以在一個表格中獲得訂單,而在其他表格中你可以得到這些訂單,這樣你就可以很容易地獲得它們 – Chococroc

+0

我清理/導出一個SQL小提琴。 – ihateartists

+0

那個ld幫了很大忙,XD – Chococroc

回答

0

好了,從你告訴我的一切,這是我完成了:

SELECT 
    o.id 
, GROUP_CONCAT(DISTINCT om.status ORDER BY om.status ASC SEPARATOR ',') status 
FROM orders o 
INNER JOIN orders_mgmt om 
ON om.order_id = o.id 
GROUP BY o.id 

我已經做了一些改變你的桌子,讓他們更容易使用,檢查小提琴:http://sqlfiddle.com/#!2/8a9f8/8

我做了什麼:

  • 我存儲狀態複選框在表中的行(檢查行3,4和5 orders_mgmt表)如果他們標記3-1檢查,您存儲3行。這樣,你只需要使用DISTINCT和GROUP BY子句就可以了。如果你想擁有一個簡歷表(我的意思是一個只有其他表中的值的特定表,爲了減少內部連接和查詢的大小來減少負載,請注意,這將打破關係型DDBB的原則,但在更好的情況下),你可以做一個觸發器,插入後將concat值和插入訂單表中,在狀態字段

  • 從我的經驗,我猜你正在使用該表字段名稱,因爲你不知道別名sintaxis(至少,我做了同樣的事情,直到我發現他們XD)。將名稱更改爲短名稱,然後將它們與別名一起引用(請參閱我將orders_mgmt寫爲om,然後將其與group by和select一起使用)。另外,不要混合使用大寫和小寫,總是使用小寫字母和下劃線,以保持自己的標準。

  • 要完成,不要在選擇中使用*通配符,它​​們是惡魔!它可以改變「*」的字段的名稱後您的疑問你慢下來,高(我已經在查詢時執行十次看到減少。

好了,希望這將幫助你實現你正在尋找的東西XD,我知道我做了更多與代碼審查相關的事情,但是我無法提供幫助,XD

相關問題