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

Retrieve data from both tables one to many relationship in mysql

我有两个 table RuleAction.

一条规则可以有很多操作

假设操作有 a1,a2,a3 3 行与一条规则相关

那我要select

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

但是r2可能没有任何规则。 所以它将 select 来自 Rule 的数据仅

结果

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

您想要的东西无法以简单的方式实现 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 fiddle 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

然后您需要通过在分隔符 ,;.

处拆分结果列来解析它