Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表join和group by id mysql_Mysql_Sql - Fatal编程技术网

表join和group by id mysql

表join和group by id mysql,mysql,sql,Mysql,Sql,以下是场景: 我想从表1中获取客户名称 通过id连接表2 从表2中选择所有付款日期 按年份分组 只是解释一下,代码和名称键属于表1 paymentDate,金额键位于表2,但它们共享外键uniqueId键 预期结果应该是这样的: [{ "code": 1011, "name": "Customer1", "amount": 5000, "paymentDate": "2016-10-20T04:00:00.000Z" "paymentDate": "2016-11-20T04:00:00.000

以下是场景:

  • 我想从表1中获取客户名称
  • 通过id连接表2
  • 从表2中选择所有付款日期
  • 按年份分组
  • 只是解释一下,代码和名称键属于表1 paymentDate,金额键位于表2,但它们共享外键uniqueId键

    预期结果应该是这样的:

    [{
    "code": 1011,
    "name": "Customer1",
    "amount": 5000,
    "paymentDate": "2016-10-20T04:00:00.000Z"
    "paymentDate": "2016-11-20T04:00:00.000Z"
    "paymentDate": "2016-12-20T04:00:00.000Z"
    },
    {
    "code": 1012,
    "name": "Customer2",
    "amount": 5000,
    "paymentDate": "2016-03-20T05:00:00.000Z"
    "paymentDate": "2016-04-20T05:00:00.000Z"
    "paymentDate": "2016-05-20T05:00:00.000Z"
    "paymentDate": "2016-06-20T05:00:00.000Z"
    },
    {
    "code": 1013,
    "name": "Customer3",
    "amount": 5000,
    "paymentDate": "2016-01-20T05:00:00.000Z"
    "paymentDate": "2016-02-20T05:00:00.000Z"
     }]
    
    到目前为止,我有:

    SELECT coreObjects.code,
           coreObjects.name,
           lateobjectpayments.amount,
           lateobjectpayments.paymentDate 
    FROM   coreObjects 
    JOIN   lateobjectpayments 
           ON coreObjects.uniqueId=lateobjectpayments.uniqueId
    GROUP BY YEAR(lateobjectpayments.paymentDate)
    

    似乎我需要在连接附近进行多选,但到目前为止还没有我想要的。如果有人能帮助我,我将不胜感激

    问题在于不能在单个GROUPBY语句中混合GROUPBY聚合(将多个原始元组合并为一个结果元组)和细节选择(需要所有原始元组)。 如果您使用一个子句
    按年份分组(lateobjectpayments.paymentDate)
    编写查询,那么每年的结果最多包含一个元组,并且只有一个customer和paymentDate与这样的结果元组相关联

    因此,将查询拆分为子查询;一个用于获取每个
    uniqueId
    年的聚合值(即
    金额
    ),另一个用于“获取”详细信息:

    select c.*, aggr.amount, lop.*
    from (select uniqueId, year(paymentDate) as year, sum(amount) as amount from
    lateobjectpayments
    group by uniqueId, year(paymentDate)) aggr
    join coreObjects c on c.uniqueId = aggr.uniqueId
    join lateobjectpayments lop on year(lop.paymentDate)=aggr.year and lop.uniqueId = aggr.uniqueId
    

    请注意,sql结果是表格形式,而不是半结构化的,例如json。但是,在您选择的任何编程语言中,从表格形式导出半结构化形式都应该很容易。

    在您的示例中,我没有看到您每年都在进行分组。这就是您一直在思考的问题吗?实际上,查询中缺少按年份分组,但仍然没有;t告诉我我想要什么您当前的输出是什么?上面查询的输出是每个客户乘以paymentDate,所以假设一个客户有4个付款日期,我有4个结果的输出,每个结果都有一个付款日期和上面的其他详细信息。我们的想法是获得客户在一年内支付的所有款项,基本上我需要客户的姓名和表1中的代码,然后将表2中的所有付款日期附加到该客户,然后需要按年份分组,因为客户可能在2016年支付了4次,在2017年支付了2次