У меня есть эти 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 то, что я пытаюсь делать?
Вот скрипка .