Mysql 选择结果不正确的内部联接

Mysql 选择结果不正确的内部联接,mysql,sql,Mysql,Sql,我有一个表,需要调用select两次,使用两个不同的where条件,并将其作为一个返回 如果我单独运行select,它会给出正确的结果,但在一个查询中使用内部联接时select不会,第二个select会加倍 该表如下所示: amount | paydate | ... -337 | 2018-01-10 | ... 1467 | 2018-01-10 | ... -322 | 2018-02-10 | ... 1452 | 2018-02-10 | ... 结果应该是:

我有一个表,需要调用select两次,使用两个不同的where条件,并将其作为一个返回

如果我单独运行select,它会给出正确的结果,但在一个查询中使用内部联接时select不会,第二个select会加倍

该表如下所示:

amount | paydate    | ...
-337   | 2018-01-10 | ...
1467   | 2018-01-10 | ...
-322   | 2018-02-10 | ...
1452   | 2018-02-10 | ...
结果应该是:

January  | 1467 | -337
February | 1452 | -322
不管我得到什么

January  | 1467 | -322
February | 1452 | -322
这是我的问题

SELECT 
    Q1.month, 
    Q1.ttlincome, 
    Q1.paydate,
    Q2.ttldebid
FROM (
        SELECT MONTHNAME(`paydate`) as month, 
        (`amount`) AS ttlincome, 
        paydate, propertiseid
                FROM `test`
            WHERE `test`.`amount` > 0 
              AND `test`.`paydate` BETWEEN '2018-01-01' AND '2018-12-31' 
            GROUP BY YEAR(`test`.`paydate`), MONTH(`test`.`paydate`)
    ) AS Q1
INNER JOIN (
        SELECT (`amount`) AS ttldebid,
        FROM `test`
            WHERE `test`.`amount` < 0 
              AND `test`.`paydate` BETWEEN '2018-01-01' AND '2018-12-31'
            GROUP BY YEAR(`test`.`paydate`), MONTH(`test`.`paydate`)
    ) AS Q2
GROUP BY YEAR(Q1.`paydate`), MONTH(Q1.`paydate`)    

也许有更好的方法来实现这一点?

我认为您的查询应该是这样的

SELECT 
    Q1.month, 
    Q1.ttlincome, 
    Q1.paydate,
    Q2.ttldebid
FROM (
        SELECT distinct MONTHNAME(`paydate`) as month, 
        (`amount`) AS ttlincome, 
        paydate, propertiseid
                FROM `test`
            WHERE `test`.`amount` > 0 
              AND `test`.`paydate` BETWEEN '2018-01-01' AND '2018-12-31' 

    ) AS Q1
INNER JOIN (
        SELECT distinct (`amount`) AS ttldebid,MONTHNAME(`paydate`) as month
        FROM `test`
            WHERE `test`.`amount` < 0 
              AND `test`.`paydate` BETWEEN '2018-01-01' AND '2018-12-31'

    ) AS Q2
on Q1.month=Q2.month
为什么不干脆做:

select monthname(paydate),
       max(amount), min(amount)
from t
where paydate >= '2018-01-01' and paydate < '2019-01-01'
group by monthname(paydate)
order by min(paydate);
或者,如果可以有两行以上:

select monthname(paydate),
       sum(case when amount > 0 then amount end),
       sum(case when amount < 0 then amount end)
from t
where paydate >= '2018-01-01' and paydate < '2019-01-01'
group by monthname(paydate)
order by min(paydate);

您需要一个连接条件您没有ON子句来指定两个子查询的行如何相互关联。您正在使用GROUP BY,但没有聚合函数。这没有什么意义。我删除了它,因为这个董事会,有另一个字段,但查询的工作方式完全相同,无论有没有ON子句。当我添加ON子句时,它就工作了:Q2中没有付款日期。