php - 除一种情况外的内连接

标签 php mysql sql laravel eloquent

我有以下统计表:

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/

相关文章:

php - 在数据库更新之前检查客户端是否更改了 ID

mysql - 在SQL中对时间(AM/PM)进行排序?

java - Play Framework 2.2 : How to define an ebean ManyToMany query

php - 解决INSERT INTO语句的语法错误

javascript - 值没有从一个动态下拉框传递到 php 中的另一个动态下拉框

php - 如果我使用 $_GET 变量进行 MYSQL 查询,空字节注入(inject)会影响我吗?

javascript - 从map.data类获取标记使用geojson谷歌地图

php-MySQL 到 JSON 数据冗余

mysql - 单个 SQL 语句 - 这可能吗?

php - mysql,在以下if条件中使用if条件的结果