【问题标题】:How to get the sum of a column from combined tables in mySQL?如何从 mySQL 中的组合表中获取列的总和?
【发布时间】:2009-04-17 23:56:02
【问题描述】:

我一直在尝试为下面的场景编写一个 mySQL 语句,但我无法让它按预期工作。如果你们能帮我把它弄好,我将不胜感激!

我在 mySQL 数据库中有两个表,eventroute

事件:

标识 |日期 |目的地 |司机 | 乘客 |描述 |执行

路线:

名称 |距离

  • drivers 包含一个字符串,其中包含在“jack:jill:john”形式的事件中注册驱动程序的用户名。
  • destination 包含事件目的地(哦,真的吗?),其值始终与表 route 中的字段 name 中的值之一相同em>(即目的地必须已经存在于 route 中)。
  • 已执行 告知事件是即将发生 (0) 还是已经执行 (1)。
  • distance 是从家到目的地的距离,以公里为单位。

我想要的是获得一个特定用户的总距离,只计算已经执行的事件。

例如,如果 Jill 已在两个执行的事件中注册为驾驶员,其中到目的地的距离分别为 50 公里和 100 公里,我希望查询返回值 150。

我知道我可以使用 ...WHERE drivers LIKE '%jill%' AND executed = 1 之类的东西来获取 Jill 驾驶的执行事件,并使用 SUM() 来获取总距离,但是我如何将这两个表结合起来并让它们全部工作?

非常感谢您的帮助!

/林纳斯

【问题讨论】:

    标签: mysql syntax


    【解决方案1】:

    我已经多年没有使用 MySQL,如果我的语法有误,很抱歉,但是应该这样做:

    在通用 SQL 中:

    select sum(distance) from route
     join event on route.name = event.destination 
     where drivers like '%jill%' AND executed = 1
    

    或者不使用JOIN:

    select sum(distance) from route, event
     where drivers like '%jill%' AND executed = 1
     and route.name = event.destination 
    

    【讨论】:

      【解决方案2】:

      Stuart 的回答向您展示了如何获取列的总和,但我只想指出:

      ...WHERE drivers LIKE '%jill%'...
      

      将返回名称中包含字母“jill”的驱动程序的任何事件。

      其次,这种数据库设计似乎没有被规范化。您有重复的司机姓名和路线名称。如果你规范化数据库并有类似的东西:

      参与者

      编号 |姓名 |角色

      事件

      编号 |日期 | route_id |描述 |执行

      路线

      编号 |姓名 |距离

      participant_event

      编号 |参与者ID | event_id

      那么处理数据会容易得多。

      如果你想实现用户搜索,你可以进行查询:

      SELECT id FROM participant WHERE
          name LIKE '%jill%' AND
          role='driver';
      

      如果查询返回多个结果,让用户/应用程序选择正确的驱动程序然后像 Stuart 的查询一样运行SELECT SUM

      SELECT SUM(r.distance) FROM route r
          JOIN event e ON e.route_id=r.id
          JOIN participant_event pe ON e.id=pe.event_id
          JOIN participant p ON pe.participant_id=p.id
          WHERE p.id=?;
      

      否则,确保您仅获得 一个 司机驾驶的总距离的唯一方法是执行以下操作(假设 drivers 以逗号分隔):

      ...WHERE LCASE(drivers)='jill' OR
          drivers LIKE 'jill, %' OR
          drivers LIKE '%, jill' OR
          drivers LIKE '%, jill,%';
      

      【讨论】:

      • 没有考虑 %jill% 的问题,感谢您的关注!该站点是一个非常小的私有服务,带有一个很小的数据库,这就是为什么我没有考虑规范化或优化查询等(自从我学习数据库课程以来已经有一段时间了)。但是,我一定会重新设计数据库并使其规范化,真的没有理由不做对。
      • 是的,我只是想我会把它扔出去。我的意思是,有时标准化的数据库并不是最佳设计。但是对于这个特定的搜索,它确实可以用一块石头杀死 2 只鸟,因为它还可以更容易地提取特定驱动程序的数据。
      猜你喜欢
      • 2021-02-15
      • 2013-10-16
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多