想象一下这是我的数据库表:
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
这只是返回一行!但是我希望从child_id
表返回(获取)所有parent
,然后通过该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 ║
╚══════════╩══════════╩════════════╝
的返回总和:
class SomeType { }
请尝试查询,我认为应该是难以获得我需要的查询!
我应该如何更改查询以获得所需的结果? (我想我应该改变整个查询)
答案 0 :(得分:1)
您需要group by子句中的所有非聚合列(parent.Child_id,parent.parent_id)。您最初只获得一行的原因是因为您根本没有group by子句。
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
答案 1 :(得分:1)
您的原始查询几乎正确,但它缺少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