Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Mysql 使用“通过三个表选择”_Mysql_Sql_Select - Fatal编程技术网

Mysql 使用“通过三个表选择”

Mysql 使用“通过三个表选择”,mysql,sql,select,Mysql,Sql,Select,我试图写一个查询,但不幸的是我没有成功。 我想知道一个人在一段时间内运送了多少包裹。 所以我想知道John user_id=1在01-02-18和28-02-18之间交付了多少个包。约翰每天开另一辆车,另一辆车牌。 订单\驱动程序.用户\ id,车牌.车牌\名称,订单.交货\日期,订单.包装\金额 我有三张桌子: 带铭牌的订单\u id交货\u日期包装\u金额 带有车牌识别号车牌名称的车牌 订购带有车牌号的司机车牌号日期用户号 我尝试了一些解决方案,但没有得到预期的结果。谢谢 尝试使用联接,如下

我试图写一个查询,但不幸的是我没有成功。 我想知道一个人在一段时间内运送了多少包裹。 所以我想知道John user_id=1在01-02-18和28-02-18之间交付了多少个包。约翰每天开另一辆车,另一辆车牌。 订单\驱动程序.用户\ id,车牌.车牌\名称,订单.交货\日期,订单.包装\金额

我有三张桌子:

带铭牌的订单\u id交货\u日期包装\u金额 带有车牌识别号车牌名称的车牌 订购带有车牌号的司机车牌号日期用户号


我尝试了一些解决方案,但没有得到预期的结果。谢谢

尝试使用联接,如下所示:

SELECT SUM(o.package_amount)
FROM orders o INNER JOIN orders_drivers od
ON o.plate_id=od.plate_id
WHERE od.user_id=<the_user_id>;
请参阅以了解更多信息

您还可以使用子查询:

SELECT SUM(o.package_amount)
FROM orders o
WHERE EXISTS (SELECT 1
              FROM orders_drivers od
              WHERE user_id=<user_id> AND o.plate_id=od.plate_id);
但说真的,你需要提出更有意义的问题

sum是一个函数,用于添加按分组依据分组的所有值

左连接通过id=id连接所有表。在这种情况下,任何其他连接都可以做到这一点,因为至少我希望所有id都是唯一的

其中,您在其中给出日期和用户

和按用户id分组,因此如果有更多相同id的记录,它们将作为一个记录返回,并按其包装数量求和


有了AS,您的结果将以“金额”的名称返回。

如果您希望在一段时间内按用户列出packageamount的总数,您可以使用以下查询:

更新:在用户id上添加where子句,以检索与John相关的数据

 SELECT od.user_id
         , p.plate_name
         , SUM(o.package_amount) AS TotalPackageAmount
    FROM   orders_drivers od
    JOIN   plates p
      ON o.plate_id = od.plate_id
    JOIN   orders o
      ON o.plate_id = od.plate_id
    WHERE  o.delivery_date BETWEEN convert(datetime,01/02/2018,103) AND convert(datetime,28/02/2018,103)
      AND  od.user_id = 1
        GROUP  BY od.user_id
                , p.plate_name 

它将用户id和车牌名称上的行分组,过滤一段交货日期,然后计算组的packageamount之和

签出加入!你到底尝试了什么?我知道join,但这个查询对我来说太复杂了。如果这个查询对你来说太复杂了,我就有一些关于你职业生涯的坏消息……如果这个查询对你来说太复杂了,你应该找其他非数据库的工作。查询,至少是有用的查询,不会比这更容易。我交换两个连接没有错误,因为第一个连接无法到达orders表,但它不会运行,只是加载。这似乎是性能问题,您是否检查了表结构,每个表的plate_id列中是否都有索引?在某些情况下,交货日期中的索引可能会提高性能。最后,您可以尝试筛选特定的用户id或车牌id,以最小化数据集的大小。如果我不加入where子句,则我不能在where子句中使用orders驱动程序。是的,修复了。。。但是你需要解决这些问题,因为我们不知道你所有的信息。我的意思是,你不只是复制粘贴它,而是修改你自己的代码。在这里,人们会带你去开门,但你必须自己找到门把手。
 SELECT od.user_id
         , p.plate_name
         , SUM(o.package_amount) AS TotalPackageAmount
    FROM   orders_drivers od
    JOIN   plates p
      ON o.plate_id = od.plate_id
    JOIN   orders o
      ON o.plate_id = od.plate_id
    WHERE  o.delivery_date BETWEEN convert(datetime,01/02/2018,103) AND convert(datetime,28/02/2018,103)
      AND  od.user_id = 1
        GROUP  BY od.user_id
                , p.plate_name