2017-10-11 76 views
0

我的問題是不同的,但我已閱讀本相似,所以帖子: How can I order by two columns, if result is equal, consider another column?MySQL的ORDER BY一列第二列

我感興趣的2列:

  • production_id
  • 日期

查詢是:

SELECT BATCH_ISSUED.production_id, MANUFACTURE_DATE.date 
FROM BATCH_ISSUED LEFT JOIN 
    MANUFACTURE_DATE 
    ON BATCH_ISSUED.production_id = MANUFACTURE_DATE.production_id 
WHERE MANUFACTURE_DATE.active='1' 
ORDER BY MANUFACTURE_DATE.date ASC,BATCH_ISSUED.production_id ASC 

這會提取數據並按日期排序(舊>新),然後按id排序,但它需要將所有相同的id組合在一起,這可能意味着需要以某種方式包含GROUP BY。

數據的一個例子:

195 2017-10-10 
196 2017-10-10 
196 2017-10-10 
258 2017-10-10 
258 2017-10-10 
189 2017-10-12 
190 2017-10-12 
258 2017-10-12 
212 2017-10-13 
213 2017-10-13 

應該提出這樣的,例如與ID 258放在一起,按日期順序排列:

195 2017-10-10 
    196 2017-10-10 
    196 2017-10-10 

    258 2017-10-10 
    258 2017-10-10 
    258 2017-10-12 

    189 2017-10-12 
    190 2017-10-12 
    212 2017-10-13 
    213 2017-10-13 

的任何建議非常感謝!

+0

什麼你的SQL查詢就像?樣本數據是什麼?預期的產出是多少? – SMA

回答

0

首先,您的WHERE子句將OUTER JOIN設置爲INNER JOIN。因此,JOIN甚至不需要。所以,你的查詢等效於:

SELECT md.production_id, md.date 
FROM MANUFACTURE_DATE md 
WHERE md.active = 1 
ORDER BY md.date ASC, md.production_id ASC; 

然後你可以使用一個JOIN得到你想要的信息:

SELECT md.production_id, md.date 
FROM MANUFACTURE_DATE md JOIN 
    (SELECT md2.production_id, MIN(md2.date) as mind 
     FROM MANUFACTURE_DATE md2 
     WHERE md.active = 1 
     GROUP BY md2.production_id 
    ) mmd 
    ON md.production_id = md2.production_id 
WHERE md.active = 1 
ORDER BY mdd.mind ASC, md.production_id ASC, md.date; 
1

這是足夠多的順序顛倒的順序:

ORDER BY BATCH_ISSUED.production_id DESC, MANUFACTURE_DATE.date ASC, 
+0

對不起@Emily Scarpetta,但我發現你的解決方案只有一半解決了我的問題。 繼續從我的問題的示例數據所以是你的代碼保持ID 258保持在一起,但其他ID的日期順序不排序最早>最新。感謝你的建議,我給了你一個積極的投票 –