子查询以获取计数

时间:2019-01-03 08:04:07

标签: couchbase n1ql

我正在尝试选择所有带孩子的父母。

我有以下查询:

SELECT 
    a.*, 
    (SELECT COUNT(*) FROM demo b WHERE b.parent = a.name) as count 
FROM demo a 
WHERE 
    meta(a).id LIKE "xyz:%" 
    AND a.parent IS MISSING 
ORDER BY a.createdAt DESC LIMIT 50 OFFSET 0

我的文档看起来类似于:

xyz:1

{
    id: 1,
    name: "parent",
    createdAt: 1234
}

xyz:2

{
    id: 2,
    name: "child",
    parent: "parent",
    createdAt: 5678
}

我收到以下错误:

  

评估投影时出错。 -原因:相关子查询中的FROM必须具有USE KEYS子句:FROM演示。

     

错误代码:5010

更新: 以下查询似乎有效:

SELECT 
    a.*, 
    (SELECT COUNT(id) as count FROM demo b WHERE b.parent = "parent")[0].count as count 
FROM demo a 
WHERE 
    meta(a).id LIKE "xyz:%" 
    AND a.parent IS MISSING 
ORDER BY a.createdAt DESC LIMIT 50 OFFSET 0

但是如果我将"parent"替换为a.name,则会出现相同的错误。

1 个答案:

答案 0 :(得分:2)

您需要先执行ANSI JOIN,然后再执行GROUP BY。查询将如下所示:

SELECT l.name, COUNT(1)
FROM demo l JOIN demo r ON r.name = l.child
GROUP BY l.name

要运行此查询,您将需要在r端添加一个索引:

CREATE INDEX demo_name_idx ON demo(name)

请务必根据实际数据测试查询;我可能会缺少一些皱纹。特别是,如果您的姓名不是唯一的,则可能要按l.id而不是l.name分组。