Mysql 选择结果不正确的内部联接
我有一个表,需要调用select两次,使用两个不同的where条件,并将其作为一个返回 如果我单独运行select,它会给出正确的结果,但在一个查询中使用内部联接时select不会,第二个select会加倍 该表如下所示: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 | ... 结果应该是:
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中没有付款日期。