在mysql中从两个表一对多关系检索数据

在mysql中从两个表一对多关系检索数据,mysql,select,left-join,Mysql,Select,Left Join,我有两个表规则和操作 一条规则可以有许多操作 假设动作有a1、a2、a3三行与一条规则相关 然后我要选择 r1.*, a1.name, a1.createdon, a1.modifiedon, a2.name, a2.createdon, a2.modifiedon, a3.name, a3.createdon, a3.modifiedon 但是r2可能没有任何规则。 因此,它将仅从规则中选择数据 结果 r* 我已经写了这个查询 SELECT * FROM R

我有两个表
规则
操作

一条规则可以有许多操作

假设动作有a1、a2、a3三行与一条规则相关

然后我要选择

r1.*, a1.name, a1.createdon, a1.modifiedon, 
      a2.name, a2.createdon, a2.modifiedon, 
      a3.name, a3.createdon, a3.modifiedon 
但是r2可能没有任何规则。 因此,它将仅从
规则
中选择数据

结果

r*
我已经写了这个查询

SELECT * 
FROM Rule RB 
LEFT JOIN (
    SELECT RelatedRuleId
    FROM Action_ GROUP BY RelatedRuleId
) R ON R.RelatedRuleId =  RB.RuleId
这不是给我正确的结果


我该怎么拉?我想要一个规则行,在同一行中有多个操作。

您可以通过简单的左连接获得它

 SELECT RB.* ,
      GROUP_CONCAT(R.name), 
      GROUP_CONCAT(R.createdon),
      GROUP_CONCAT(R.modifiedon)
    FROM Rule RB 
    LEFT JOIN  Action R ON R.RelatedRuleId =  RB.RuleId 
    GROUP BY RB.RuleId

你可以通过简单的左连接得到它

 SELECT RB.* ,
      GROUP_CONCAT(R.name), 
      GROUP_CONCAT(R.createdon),
      GROUP_CONCAT(R.modifiedon)
    FROM Rule RB 
    LEFT JOIN  Action R ON R.RelatedRuleId =  RB.RuleId 
    GROUP BY RB.RuleId

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

您可以做的是预先查询操作的数量,并在应用程序代码中使用适当数量的列动态构建SQL,或者使用
group\u 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小提琴以使用它)

这会产生如下结果:

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

然后需要通过在分隔符
处拆分结果列来解析结果列

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

您可以做的是预先查询操作的数量,并在应用程序代码中使用适当数量的列动态构建SQL,或者使用
group\u 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小提琴以使用它)

这会产生如下结果:

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

然后需要通过在分隔符
处拆分结果列来解析结果列

否,我希望在一行中显示一个规则Id和所有操作详细信息。不在单独的行中他想加入3个表
a1和a2以及a3
@unknown用户:更新答案。您可以使用组concat@Mahesh我明白你的意思,但我不想要逗号分隔的值,我想要不同的列。不,我想要一个规则Id和所有操作细节在一行中。不在单独的行中他想加入3个表
a1和a2以及a3
@unknown用户:更新答案。您可以使用组concat@Mahesh我明白你的意思,但我不想要逗号分隔的值,我想要不同的列