【问题标题】:MySql: Getting sum of a table by the id of its parent from other tableMySql:通过其父表的ID从其他表中获取表的总和
【发布时间】:2015-12-26 03:56:33
【问题描述】:

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

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    ║                   
╚══════════╩═════════════════╩═══════╝

这是我的表格值:

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         ║100         ║
║══════════╬══════════╬════════════╣
║ 2        ║2         ║250         ║
║══════════╬══════════╬════════════╣
║ 3        ║1         ║35          ║
║══════════╬══════════╬════════════╣
║ 4        ║1         ║17          ║
╚══════════╩══════════╩════════════╝

我有一个查询,但它没有按我想要的方式工作。

这是我的查询:

SELECT parent.Child_id, parent.parent_id,  SUM( paid_price )
FROM paid
JOIN parent ON parent.Child_id = paid.Child_id
WHERE parent.parent_id =25

这只是返回一行!但我希望从parent 表中返回(获取)所有child_id,然后通过该ID 返回它们每个的总和paid_price

现在我刚刚返回的查询:

╔══════════╦══════════╦════════════╗
║ Child_id ║Parent_id ║ paid_price ║
╠══════════╬══════════╬════════════╣
║ 1        ║25        ║152         ║
╚══════════╩══════════╩════════════╝

但是你可以看到parent_id = 25 有一些孩子,但我写的查询只返回其中一个(只是第一个)!我想要 paid_price 的返回总和,所有 parent_id 编号为 25:

╔══════════╦══════════╦════════════╗
║ Child_id ║Parent_id ║ paid_price ║
╠══════════╬══════════╬════════════╣
║1         ║25        ║152         ║
║══════════╬══════════╬════════════╣
║2         ║25        ║250         ║
╚══════════╩══════════╩════════════╝

请尝试查询,我认为要得到我需要的东西应该很难查询!

我应该如何更改查询以获得所需的结果? (我认为我应该更改整个查询)

【问题讨论】:

  • 我怀疑 SUM() 函数,也许吧?尝试添加GROUP BY Child_id

标签: mysql sql select join


【解决方案1】:

您需要 group by 子句中的所有非聚合列(parent.Child_id、parent.parent_id)。您最初只有一行的原因是因为您根本没有 group by 子句。

SQL Fiddle

MySQL 5.6 架构设置

CREATE TABLE parent
    (`Child_id` int, `parent_id` int, `title` varchar(7))
;

INSERT INTO parent
    (`Child_id`, `parent_id`, `title`)
VALUES
    (1, 25, 'bla-bla'),
    (2, 25, 'bla-bla'),
    (3, 5, 'bla-bla'),
    (4, 25, 'bla-bla')
;


CREATE TABLE paid
    (`Paid_id` int, `Child_id` int, `paid_price` int)
;

INSERT INTO paid
    (`Paid_id`, `Child_id`, `paid_price`)
VALUES
    (1, 1, 100),
    (2, 2, 250),
    (3, 1, 35),
    (4, 1, 17)
;

查询 1

SELECT parent.Child_id, parent.parent_id, sum(paid.paid_price)
FROM paid
JOIN parent ON parent.Child_id = paid.Child_id
WHERE parent.parent_id =25
group by parent.Child_id, parent.parent_id

Results

| Child_id | parent_id | sum(paid.paid_price) |
|----------|-----------|----------------------|
|        1 |        25 |                  152 |
|        2 |        25 |                  250 |

请注意 MySQL 的默认服务器设置允许在使用 GROUP BY 时使用“惰性”语法。不幸的副作用就是这样的问题。始终包括所有非聚合列,您将避免此类问题。请参考https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

【讨论】:

  • 您不需要 GROUP BY 父 ID,实际上您的 WHERE 子句使这个额外的分组毫无意义。
  • @Tim Biegeleisen 如果您接受 MySQL 中的默认位置,那么是的,您可以避免指定所有列,但是我从不这样做,因为如果更改服务器设置,您的 GROUP BY 子句可能会失败。我只是采用我所知道的所有其他 SQL 数据库所强制执行的做法;包括所有非聚合列,这并不难,而且可以始终如一地工作。
【解决方案2】:

您的原始查询几乎正确,但缺少GROUP BY 子句:

SELECT parent.Child_id, SUM(paid.paid_price) AS paid_price
FROM parent
INNER JOIN paid ON parent.Child_id = paid.Child_id
WHERE parent.parent_id = 25
GROUP BY paid.Child_id

【讨论】:

  • 谢谢,但这只是返回一行!
  • 我认为您的数据有问题。我的查询没问题。
  • 对不起,你是对的!谢谢。您的查询很棒,确实运行良好
猜你喜欢
  • 2016-04-06
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2018-12-12
相关资源
最近更新 更多