从 mysql 中一对多关系的两个表中检索数据
Retrieve data from both tables one to many relationship in mysql
我有两个 table Rule
和 Action
.
一条规则可以有很多操作
假设操作有 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
然后您需要通过在分隔符 ,
和 ;
.
处拆分结果列来解析它
我有两个 table Rule
和 Action
.
一条规则可以有很多操作
假设操作有 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
然后您需要通过在分隔符 ,
和 ;
.