【问题标题】:Retrieve data from both tables one to many relationship in mysql在mysql中从两个表中检索数据一对多关系
【发布时间】:2016-07-18 14:17:12
【问题描述】:

我有两张桌子RuleAction

一个规则可以有很多动作

假设 Action 有 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

这没有给我正确的结果。

我怎样才能拉这个?我想要一个规则行,在同一行中包含多个操作。

【问题讨论】:

    标签: mysql select left-join


    【解决方案1】:

    在普通 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
    

    然后您需要通过在分隔符,; 处拆分结果列来解析它。

    【讨论】:

      【解决方案2】:

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

       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
      

      【讨论】:

      • 不,我想要一行中的一个规则 ID 和所有操作详细信息。不在单独的行中
      • 他要加入3张桌子a1 and a2 and a3
      • @UnknownUser:更新了答案。你可以使用组连接
      • @Mahesh 我明白你的意思,但我不想要逗号分隔值我想要不同的列
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2012-12-09
      相关资源
      最近更新 更多