2015-01-21 44 views
-1

我試着解決這個問題超過兩個小時。我需要你的幫助。我想通過這個查詢從兩個表中的數據進行排序:SQL ORDER BY兩個條件

SELECT * 
FROM (

SELECT INV.`id` , INV.`userid` , Cli.firstname, Cli.lastname, Cli.companyname, Cli.currency, INV.`total` , INV.`date` , INV.`duedate` 
FROM tblinvoices AS INV, tblclients Cli 
WHERE now() >= DATE_ADD(INV.duedate, INTERVAL +2 
DAY) 
AND INV.STATUS = 'unpaid' 
AND Cli.id = INV.userid 
AND INV.total >=200 
AND INV.`date` != INV.`duedate` 
) AS X 
ORDER BY X.duedate ASC 

我得到這樣的結果:

id userid firstname lastname companyname  currency total date duedate 
3 3 younes Abakarim  1 154877.00 2014-10-18 2014-11-01 
9 12 Faissal Marouan 1 2568.00  2014-10-23 2014-11-06 
34 3 younes Abakarim  1 252.60 2015-01-10 2015-01-15 
31 12 Faissal Marouan 1 288.00 2015-01-01 2015-01-15 
36 3 younes Abakarim Bestgallery 1 288.00 2015-01-16 2015-01-19 

但我想是這樣的:

id userid firstname lastname companyname  currency total date duedate 
3 3 younes Abakarim  1 154877.00 2014-10-18 2014-11-01 
34 3 younes Abakarim  1 252.60 2015-01-10 2015-01-15 
36 3 younes Abakarim Bestgallery 1 288.00 2015-01-16 2015-01-19 
9 12 Faissal Marouan 1 2568.00  2014-10-23 2014-11-06 
31 12 Faissal Marouan 1 288.00 2015-01-01 2015-01-15 

而且通過仍然排序duedate

+0

-1你說你想要的數據集沒有按duedate排序,這就是爲什麼查詢不按照期望的順序返回結果的原因,當你通過duedate排序時。 – 2015-01-21 12:26:28

回答

0

首先,你應該修正您的查詢,所以它使用正確的join語法,並且有點可讀性:

SELECT * 
FROM (SELECT INV.`id` , INV.`userid` , Cli.firstname, Cli.lastname, 
      Cli.companyname, Cli.currency, 
      INV.`total` , INV.`date` , INV.`duedate` 
     FROM tblinvoices INV JOIN 
      tblclients Cli 
      ON Cli.id = INV.userid 
     WHERE NOW() >= DATE_ADD(INV.duedate, INTERVAL + 2 DAY) AND 
      INV.STATUS = 'unpaid' AND 
      INV.total >= 200 AND 
      INV.`date` <> INV.`duedate` 
    ) ic 
ORDER BY Xic.duedate ASC; 

接下來,要得到你想要的東西有點複雜。您需要爲每個客戶提供相同的截止日期。這需要加盟呢?這將是簡單得多如果MySQL支持的熱膨脹係數,但很可惜:

SELECT ic.* 
FROM (SELECT INV.`id` , INV.`userid` , Cli.firstname, Cli.lastname, 
      Cli.companyname, Cli.currency, 
      INV.`total` , INV.`date` , INV.`duedate` 
     FROM tblinvoices INV JOIN 
      tblclients Cli 
      ON Cli.id = INV.userid 
     WHERE NOW() >= DATE_ADD(INV.duedate, INTERVAL + 2 DAY) AND 
      INV.STATUS = 'unpaid' AND 
      INV.total >= 200 AND 
      INV.`date` <> INV.`duedate` 
    ) ic JOIN 
    (SELECT INV.`userid`, MAX(INV.`duedate`) as maxdd 
     FROM tblinvoices INV 
     WHERE NOW() >= DATE_ADD(INV.duedate, INTERVAL + 2 DAY) AND 
      INV.STATUS = 'unpaid' AND 
      INV.total >= 200 AND 
      INV.`date` <> INV.`duedate` 
     GROUP BY INV.`userid` 
    ) ud 
    ON ic.userid = ud.userid 
ORDER BY ud.maxdd ASC, ic.userid; 

我不知道,如果你想最大或到期日期排序的分鐘。這兩者相當於你的例子。

0

添加第二類attribut用逗號:

SELECT * 
FROM (

SELECT INV.`id` , INV.`userid` , Cli.firstname, Cli.lastname, Cli.companyname, Cli.currency, INV.`total` , INV.`date` , INV.`duedate` 
FROM tblinvoices AS INV, tblclients Cli 
WHERE now() >= DATE_ADD(INV.duedate, INTERVAL +2 
DAY) 
AND INV.STATUS = 'unpaid' 
AND Cli.id = INV.userid 
AND INV.total >=200 
AND INV.`date` != INV.`duedate` 
) AS X 
ORDER BY X.userid ASC, x.duedate ASC 
0

使用此:

SELECT * 
FROM (
SELECT INV.`id` 
    ,INV.`userid` 
    ,Cli.firstname 
    ,Cli.lastname 
    ,Cli.companyname 
    ,Cli.currency 
    ,INV.`total` 
    ,INV.`date` 
    ,INV.`duedate` 
FROM tblinvoices AS INV 
    ,tblclients Cli 
WHERE now() >= DATE_ADD(INV.duedate, INTERVAL + 2 DAY) 
    AND INV.STATUS = 'unpaid' 
    AND Cli.id = INV.userid 
    AND INV.total >= 200 
    AND INV.`date` != INV.`duedate` 
) AS X 
ORDER BY x.userid ASC 
,X.duedate ASC; 
0

試試這個 - by子句添加組:

SELECT * 
FROM (

SELECT INV.`id` , INV.`userid` , Max(Cli.firstname) firstname, Max(Cli.lastname) lastname, Max(Cli.companyname) companyname, Max(Cli.currency) currency, Max(INV.`total`) total , Max(INV.`date`) date , Max(INV.`duedate`) duedate 
FROM tblinvoices AS INV, tblclients Cli 
WHERE now() >= DATE_ADD(INV.duedate, INTERVAL +2 
DAY) 
AND INV.STATUS = 'unpaid' 
AND Cli.id = INV.userid 
AND INV.total >=200 
AND INV.`date` != INV.`duedate` 
group by INV.userid, INV.id) AS X 
ORDER BY X.duedate ASC