在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我明白你的意思,但我不想要逗号分隔的值,我想要不同的列