我有两个表RuleAction

一个规则可以有很多动作

可以说动作有a1,a2,a3 3个与一个规则相关的行

然后我想选择

r1.*, a1.name, a1.createdon, a1.modifiedon,
      a2.name, a2.createdon, a2.modifiedon,
      a3.name, a3.createdon, a3.modifiedon


但是r2可能没有任何规则。
因此它将仅从Rule选择数据

结果

r*


我已经写了这个查询

SELECT *
FROM Rule RB
LEFT JOIN (
    SELECT RelatedRuleId
    FROM Action_ GROUP BY RelatedRuleId
) R ON R.RelatedRuleId =  RB.RuleId


这没有给我正确的结果。

我怎么拉这个?我想要一个规则行,同一行中有多个动作。

最佳答案

在普通SQL中无法实现所需的功能,因为在发出查询之前必须知道结果集中的列数。根据您的要求,列数由表的内容确定。这在SQL中是不可能的。

您可以做的是要么预先查询操作数,然后在应用程序代码中使用适当数量的列动态构建SQL,要么使用group_concat将结果合并为一列,如下所示:

select rule.id,
       rule.name,
       group_concat(concat(action.name, ';',
                           action.createdon, ';',
                           action.modifiedon)) as actions
from rule
inner join action on rule.id = action.rule_id
group by rule.id


(另请参见SQL小提琴http://sqlfiddle.com/#!9/94596/6进行操作)

这样会产生类似:

id  name    actions
1   rule1   action1;2016-01-05;2016-02-06,action2;2016-01-06;2016-02-05
2   rule2   action3;2016-01-12;2016-02-19


然后,您需要通过在分隔符,;处对结果列进行解析,以对其进行分析。

关于mysql - 在MySQL中从两个表中一对多的关系中检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38439044/

10-15 13:46