N1QL多重连接和求和查询产生错误的输出

问题描述 投票:0回答:1

我有一个包含以下三个文档的存储桶:

coffee {
    id
}

cold_coffee {
    coffeeId
    number
}

warm_coffee {
    coffeeId
    number
}

我已经使用Couchbase Server Community Edition 6.0.0在N1QL中编写了以下查询:

SELECT META(coffee).id as coffeeId,
SUM(cold_coffee.`number`) as `ccNumber`,
SUM(warm_coffee.`number`) as `wcNumber`,
FROM coffee_bucket coffee
left JOIN coffee_bucket cold_coffee
    ON  META(coffee).id = cold_coffee.coffeeId 
    and cold_coffee.type='cold_coffee'
left JOIN coffee_bucket warm_coffee
    ON META(coffee).id = warm_coffee.coffeeId 
    and warm_coffee.type='warm_coffee'
where coffee.type='coffee'
group by META(coffee).id;

我为每份咖啡有多个cold_coffee和warm_coffee文件,我需要对所有cold_coffee和warm_coffee文件的数字求和。我遇到的问题是,例如,如果我有以下文档:

[
    coffee {
        id: 1
    },
    cold_coffee {
        coffeeId:1
        number:5 
    },
    cold_coffee {
        coffeeId:1
        number:5 
    },
    warm_coffee {
        coffeeId:1
        number:10
    }
]

我的总计是:

ccNumber: 10
wcNumber:20 

似乎是因为连接,所以对单个warm_coffee文件进行了两次计数?

我遇到了site,可能有相同的错误,但不幸的是它是SQL。

而且我不确定如何使用N1QL解决此问题,因为JOIN的右手项必须是表/存储桶,如以下post所示。

这里是可能的solution,但我不确定如何实现此为N1QL?

有人可以帮忙吗?

couchbase n1ql
1个回答
1
投票
第二个JOIN最多使用最左边的一个文档。 DISTINCT上的SUM可能不起作用,因为对相同值(warm_coffee,可能正在计数)的不同文档进行一次计数。如果我是对的,那么您正在寻找第二次加入,以使用大多数咖啡中的独特文档。

也许您正在寻找类似的东西

SELECT c.coffeeId, MAX(c.ccNumber) AS `ccNumber`, SUM(warm_coffee.`number`) AS `wcNumber`, FROM ( SELECT META(coffee).id AS coffeeId, SUM(cold_coffee.`number`) AS `ccNumber` FROM coffee_bucket coffee LEFT JOIN coffee_bucket cold_coffee ON META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee' WHERE coffee.type='coffee' GROUP BY META(coffee).id ) AS c LEFT JOIN coffee_bucket warm_coffee ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee' GROUP BY c.coffeeId;

3级加入

SELECT d.coffeeId,
       MAX(c.ccNumber) AS `ccNumber`,
       MAX(c.wcNumber) AS `wcNumber`,
       SUM(ch.`number`) AS `chNumber`
FROM ( SELECT c.coffeeId,
              MAX(c.ccNumber) AS `ccNumber`,
              SUM(warm_coffee.`number`) AS `wcNumber`,
       FROM ( SELECT META(coffee).id AS coffeeId,
              SUM(cold_coffee.`number`) AS `ccNumber`
              FROM coffee_bucket coffee
              LEFT JOIN coffee_bucket cold_coffee
                   ON  META(coffee).id = cold_coffee.coffeeId AND cold_coffee.type='cold_coffee'
              WHERE coffee.type='coffee'
              GROUP BY META(coffee).id
            ) AS c
       LEFT JOIN coffee_bucket warm_coffee
                 ON c.coffeeId = warm_coffee.coffeeId AND warm_coffee.type='warm_coffee'
       GROUP BY c.coffeeId) AS d
LEFT JOIN coffee_bucket ch
     ON d.coffeeId = ch.coffeeId AND ch.type='chaoc_coffee'
GROUP BY d.coffeeId
;
© www.soinside.com 2019 - 2024. All rights reserved.