Сравнение нескольких материалов из двух таблиц в агрегации - PullRequest
0 голосов
/ 20 марта 2020

У меня есть эти MySQL таблицы:


mysql> select * from answer;
+----+------------+------------+----------+
| id | questionId | responseId | optionId |
+----+------------+------------+----------+
|  1 |          1 |          1 |        1 |
|  2 |          1 |          2 |        2 |
+----+------------+------------+----------+

mysql> select * from `option`;
+----+-------+------+------------+
| id | label | text | questionId |
+----+-------+------+------------+
|  1 | yes   | Yes  |          1 |
|  2 | no    | No   |          1 |
+----+-------+------+------------+

mysql> select * from rule;
+----+-------+-----------+------------+
| id | label | condition | variableId |
+----+-------+-----------+------------+
|  1 | rule1 | any       |          1 |
|  2 | rule2 | all       |          1 |
|  3 | rule3 | none      |          1 |
+----+-------+-----------+------------+

mysql> select * from rule_options_option;
+--------+----------+
| ruleId | optionId |
+--------+----------+
|      1 |        1 |
|      2 |        1 |
|      3 |        1 |
|      3 |        2 |
+--------+----------+

mysql> select * from variable;
+----+-----------+----------+
| id | label     | surveyId |
+----+-----------+----------+
|  1 | variable1 |        1 |
+----+-----------+----------+

И я пытаюсь сделать вывод похожим на это:

answerId|optionId|optionLabel|var1             |
--------|--------|-----------|-----------------|
       1|       1|yes        |rule1,rule2      |
       2|       2|no         |rule1            |

На основе этих правил:

  • Правило 1:

    Если любой из optionIds в rule_options_option существует в answer, правило отображается в столбце var1.

  • Правило 2:

    Если все , optionIds в rule_options_option существует в answer, правило отображается в столбце var1.

  • Правило 3:

    Если нет optionIds в rule_options_option существует в answer правило отображается в столбце var1.

Я собрал эту наивную реализацию, которая, очевидно, не сработает:

SELECT a.id as answerId, o.id as optionId, o.label as optionLabel, 
rule1.label as any, rule2.label as `all`, rule3.label as none,
GROUP_CONCAT(IF(v.label = 'variable1', rule1.label, NULL)) as var1
FROM answer a 
LEFT JOIN `option` o ON o.id = a.optionId
LEFT JOIN rule_options_option ro ON ro.optionId = a.optionId
LEFT OUTER JOIN rule ON rule.id = ro.ruleId
LEFT JOIN rule rule1 ON (rule1.condition = 'any' and rule1.id = ANY(SELECT ruleId FROM rule_options_option))
LEFT JOIN rule rule2 ON (rule2.condition = 'all' and rule2.id = ALL(SELECT ruleId FROM rule_options_option))
LEFT JOIN rule rule3 ON (rule3.condition = 'none' and rule3.id != ro.ruleId)
LEFT JOIN variable v ON v.id = rule.variableId
GROUP BY a.id

Какой хороший способ выполнить sh то, что я пытаюсь делать?

Вот скрипка .

...