Подзапрос для получения количества - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь выбрать всех родителей по количеству их детей.

У меня следующий запрос:

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 demo.

Код ошибки: 5010

UPDATE: Кажется, что работает следующий запрос:

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 голосов
/ 03 января 2019

Вам нужно выполнить 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, если ваши имена не уникальны.

...