我有以下统计表:
id | date | user_id | price | additional_price
我的查询如下所示:
SELECT month, sum(price), sum(additional_price)
FROM statistics s
INNER JOIN users u on s.user_id = u.id
AND u.confirmed = 1
GROUP BY MONTH(date);
问题在于,该表中存在价格等于0
的行,但additional_price大于0
,用户未确认,或者不确认不再存在了。我想将它们计入输出总和。像这样的东西:
SELECT t.month, sum(t.price), sum(t.additional_price)
FROM (
(SELECT month, sum(price), sum(additional_price)
FROM statistics s
INNER JOIN users u on s.user_id = u.id
WHERE u.confirmed = 1
AND s.price > 0
GROUP BY MONTH(date))
UNION
(SELECT month, sum(price), sum(additional_price)
FROM statistics s
WHERE price = 0
GROUP BY MONTH(date))
) AS t
GROUP BY MONTH(t.date);
它会起作用,这就是我想要达到的结果。但查询速度慢、规模大且难以维护。我遇到的主要问题是我不能在这样的表上使用关系:
$statistics = Statistic::join('users');
$statisticsForZeroPrice = Statistic::forZeroPrice();
$result = DB::query()->fromSub($statistics->union($statisticsForZeroPrice), 't')
->with('user') // will not work
->groupBy('t.date')
->get();
这个问题有更简单的解决方案吗?
最佳答案
我猜你想要一个左连接
。从您问题中的有限信息来看,是这样的:
SELECT month, sum(price), sum(additional_price)
FROM statistics s LEFT JOIN
users u
ON s.user_id = u.id AND u.confirmed = 1
GROUP BY MONTH(date);
不清楚哪个表应该位于左连接
中的第一个。
关于php - 除一种情况外的内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60019771/