【问题标题】:writing query for joining and getting the sum of all rows in mySql编写查询以加入并获取 mySql 中所有行的总和
【发布时间】:2015-12-25 20:03:10
【问题描述】:

(抱歉标题和上下文不好,我不是以英语为母语的人)

想象一下这是我的数据库表:

Table #1: Parent
╔══════════╦═════════════════╦═══════╗
║Child_id  ║Primary key - AI ║ int   ║
╠══════════╬═════════════════╬═══════╣
║parent_id ║Index-Forign_key ║ int   ║
║══════════╬═════════════════╬═══════╣
║title     ║        -        ║varchar║                   
╚══════════╩═════════════════╩═══════╝

Table #2: Paid
╔══════════╦═════════════════╦═══════╗
║Paid_id   ║Primary key - AI ║ int   ║
╠══════════╬═════════════════╬═══════╣
║child_id  ║Index-Forign_key ║ int   ║
║══════════╬═════════════════╬═══════╣
║paid_price║        -        ║int    ║                   
╚══════════╩═════════════════╩═══════╝

现在我想要一个查询,返回 paid_price 的总和,parent_id

我的意思是查询从parent 表中获取所有child_ids,然后通过每个child_idpaid 表中获取paid_price 的总和。

想象一下这些是我的表格的数据:

 Table: parent (data)
╔══════════╦══════════╦═══════╗
║ Child_id ║parent_id ║ title ║
╠══════════╬══════════╬═══════╣
║ 1        ║25        ║bla-bla║
║══════════╬══════════╬═══════╣
║ 2        ║25        ║bla-bla║
║══════════╬══════════╬═══════╣
║ 3        ║5         ║bla-bla║
║══════════╬══════════╬═══════╣
║ 4        ║25        ║bla-bla║
╚══════════╩══════════╩═══════╝

 Table: paid (data)
╔══════════╦══════════╦════════════╗
║ Paid_id  ║Child_id  ║ paid_price ║
╠══════════╬══════════╬════════════╣
║ 1        ║1         ║1000000     ║
║══════════╬══════════╬════════════╣
║ 2        ║2         ║2500000     ║
║══════════╬══════════╬════════════╣
║ 3        ║1         ║3506000     ║
║══════════╬══════════╬════════════╣
║ 4        ║1         ║1700000     ║
╚══════════╩══════════╩════════════╝

我希望我能很好地描述我需要的东西

*注意:这不是我的数据库结构。我只是想查询。这更难写我真正的数据库表。

【问题讨论】:

    标签: mysql sql performance


    【解决方案1】:

    您可以使用GROUP BYSUM() 来实现(如果我理解正确的话)

    https://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html

    您可以使用类似这样的查询轻松地从支付表中获取每个 Child_id 的支付价格总和:

    SELECT Child_id, SUM(paid_price) FROM paid GROUP BY Child_id;
    

    如果你想让标题在同一个结果中,你可以用ON paid.Child_id = parent.Child_id作为加入条件。

    【讨论】:

    • 谢谢。如何通过 child_id 获取?例如只是 child_id = 1
    • 一个简单的地方应该做。只需在GROUP BY 之前添加:WHERE Child_id = 1。 (与这个具体的 where 子句无关,过滤分组结果时要注意的一件事是 WHERE 和 HAVING 之间的区别。stackoverflow.com/questions/9253244/sql-having-vs-where
    • 谢谢,我还有一个问题。如何通过 parent_id 从第一个表(父)中获取所有 child_id 并将其用作变量(用于 where)
    • 如果加入父表,则可以使用 where 子句中的所有父表列:WHERE parent.parent_id = 5 整个查询可能类似于:SELECT Child_id, SUM(paid_price) FROM paid LEFT JOIN parent ON paid.Child_id = parent.Child_id WHERE parent.parent_id = 5 GROUP BY paid.Child_id
    • 非常感谢,这是有效的,但我想要这个包含 parent_id 的 child_id(s) 的返回列表(它们的总和)
    【解决方案2】:

    我目前没有简单的方法来测试这个,但基本上你需要在 child_id 上加入两个表,然后在将 sum() 聚合函数应用于paid_price 时按 parent_id 分组。类似的东西:

    with J as( select P.parent_id,Q.paid_price from parent P
       inner join paid Q on P.Child_id=Q.Child_id)
    select parent_id, sum(paid_price) from J group by parent_id
    

    【讨论】:

    • 您的查询显示#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'J as( select P.parent_id,Q.paid_price from parent P inner join paid Q on P.C' at line 1
    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 2020-04-19
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多