Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL ORDER BY有两个条件_Php_Mysql_Sql - Fatal编程技术网

Php SQL ORDER BY有两个条件

Php SQL ORDER BY有两个条件,php,mysql,sql,Php,Mysql,Sql,我已经试着解决这个问题两个多小时了。我需要你的帮助。我想使用以下查询对两个表中的数据进行排序: 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

我已经试着解决这个问题两个多小时了。我需要你的帮助。我想使用以下查询对两个表中的数据进行排序:

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排序。

添加第二个带有逗号的排序属性:

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
使用以下命令:

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;

尝试此操作-添加group 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

首先,您应该修复查询,使其使用正确的联接语法,并具有一定的可读性:

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支持CTE,这会简单得多,但遗憾的是:

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;

我不确定您是想要分拣到期日的最大值还是最小值。对于您的示例,这两者是等效的。

-1您所需的数据集未按duedate排序,这就是为什么在按duedate排序时,查询不会按所需顺序返回结果的原因。