Вот простой способ - просто измените новое, чтобы оно выглядело как старое:
Обратите внимание, это было отредактировано для использования 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
Могут применяться и другие бизнес-правила.
Мне что по существу та же операция для всех 3 вопросов кажется. Вы всегда просите "Находить все X ниже узла (узлов) Y, где X имеет тип Z". Все, в чем Вы нуждаетесь, является универсальным механизмом для, 'определяют местоположение всех узлов ниже узла', (решает Q3) и затем можно отфильтровать результаты для 'nodetype=sink' (решает Q1). Для Q2 у Вас есть отправная точка (Ваш набор узлов) и Ваша конечная точка (любой приемник ниже начальной точки), таким образом, Ваш набор решения является всеми путями от стартового узла, указанного к приемнику. Таким образом, я предположил бы, что то, что у Вас в основном есть дерева и основных алгоритмов обхода дерева, было бы способом пойти.
Несмотря на то, что Ваш график является нециклическим, операции, которые Вы цитируете, напоминают мне о подобных аспектах анализа графика потока управления. Существует богатый набор алгоритмов на основе преобладания, которое может быть применимо. Например, Ваша третья операция напоминает мне передозировка вычислительные границы преобладания; я полагаю, что алгоритм работал бы непосредственно при временном представлении узлов "записи" и "выхода". Узел записи соединяет "данный набор узлов", и узлы выхода соединяет приемники.
Также посмотрите основные алгоритмы Robert Tarjan.