Как я нахожу все пути через ряд данного узлы в DAG?

Вот простой способ - просто измените новое, чтобы оно выглядело как старое:

Обратите внимание, это было отредактировано для использования CTE, так как у вас был подзапрос с подсчетом.

WITH flagevent_comb as (
   SELECT user, country, COUNT(DISTINCT country) as cnt
   FROM (
     SELECT user, country1 AS country FROM flagevent WHERE country1 IS NOT NULL
     UNION ALL
     SELECT user, country2 AS country FROM flagevent WHERE country2 IS NOT NULL  
   ) x
   GROUP BY user, country
)
SELECT f.cnt as totalflags,
    GROUP_CONCAT(DISTINCT(country) ORDER BY c.name) AS allcountries,
    f.user, u.username
FROM flagevent_comb AS f
INNER JOIN country AS c ON f.country = c.code
INNER JOIN user AS u ON f.user = u.id
WHERE f.user = 1
    OR f.user in (1, 2, 3)
GROUP BY user
ORDER BY totalflags DESC;

Обратите внимание, что вам, возможно, придется усложнить подзапрос. Например, если иногда страна1 или страна2 равны нулю, это, вероятно, будет лучше.

   SELECT user, country1 AS country FROM flagevent WHERE country1 IS NOT NULL
   UNION ALL
   SELECT user, country2 AS country FROM flagevent WHERE country2 IS NOT NULL

Могут применяться и другие бизнес-правила.

12
задан Glorfindel 21 February 2019 в 20:01
поделиться

2 ответа

Мне что по существу та же операция для всех 3 вопросов кажется. Вы всегда просите "Находить все X ниже узла (узлов) Y, где X имеет тип Z". Все, в чем Вы нуждаетесь, является универсальным механизмом для, 'определяют местоположение всех узлов ниже узла', (решает Q3) и затем можно отфильтровать результаты для 'nodetype=sink' (решает Q1). Для Q2 у Вас есть отправная точка (Ваш набор узлов) и Ваша конечная точка (любой приемник ниже начальной точки), таким образом, Ваш набор решения является всеми путями от стартового узла, указанного к приемнику. Таким образом, я предположил бы, что то, что у Вас в основном есть дерева и основных алгоритмов обхода дерева, было бы способом пойти.

2
ответ дан 2 December 2019 в 23:43
поделиться

Несмотря на то, что Ваш график является нециклическим, операции, которые Вы цитируете, напоминают мне о подобных аспектах анализа графика потока управления. Существует богатый набор алгоритмов на основе преобладания, которое может быть применимо. Например, Ваша третья операция напоминает мне передозировка вычислительные границы преобладания; я полагаю, что алгоритм работал бы непосредственно при временном представлении узлов "записи" и "выхода". Узел записи соединяет "данный набор узлов", и узлы выхода соединяет приемники.

Также посмотрите основные алгоритмы Robert Tarjan.

2
ответ дан 2 December 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: