我有两个表Rule
和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
这没有给我正确的结果。
我怎么拉这个?我想要一个规则行,同一行中有多个动作。
最佳答案
在普通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/