通过三个表使用SELECT

时间:2018-03-21 15:07:24

标签: mysql sql select

我试着写一个查询,但不幸的是我没有成功。 我想知道一个人在一定时期内交付了多少包裹 所以我想知道John(user_id = 1)在01-02-18和28-02-18之间交付了多少包。约翰每天开另一辆车(另一个plate_id) (orders_drivers.user_id,plates.plate_name,orders.delivery_date,orders.package_amount)

我有3张桌子:

使用 plate_id delivery_date package_amount
订单 /> plate_id plate_name 铭牌 plate_id plate_date user_id
< orders_drivers / p>

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

3 个答案:

答案 0 :(得分:0)

尝试使用JOINS,如下所示:

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>;

请参阅MySQL Join Made Easy了解相关信息。

您还可以使用子查询:

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);

答案 1 :(得分:0)

SELECT sum(orders.package_amount) AS amount
FROM orders
LEFT JOIN plates ON orders.plate_id = orders_drivers.plate_id
LEFT JOIN orders_driver ON orders.plate_id = orders_drivers.plate_id
WHERE orders.delivery_date > date1 AND orders.delivery_date < date2 AND orders_driver.user_id = userid
GROUP BY orders_drivers.user_id

但严重的是,你需要提出更有意义的问题。

sum是一个函数,用于添加已按GROUP BY分组的所有值。

LEFT JOIN通过id = id连接所有表。在这种情况下,任何其他连接都可以执行此操作,因为所有ID都是唯一的(至少我希望如此)。

在哪里,您在哪里提供日期和用户。

和GROUP BY用户ID,所以如果有更多相同ID的记录,它们将作为一个返回(并按其包装金额加总。)

使用AS,您的结果将以名称&#39;,&#39;,

返回

答案 2 :(得分:0)

如果您想要一段时间内用户的packageamount总数,您可以使用此查询:

更新:在where上添加user_id子句,以检索与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 

groupsuser_id上的plate_name行,过滤一段delivery_date(s),然后计算该组的包数总和