2015-01-21 1 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. –

ответ

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

Попробуйте это - добавление группы по статье:

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 
Смежные вопросы