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

标签 mysql select left-join

我有两个表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

这没有给我正确的结果。

我该如何拉这个?我想要一个规则行在同一行中有多个操作。

最佳答案

您想要的结果在普通 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

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

关于mysql - 从mysql中一对多关系的两个表中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38439044/

相关文章:

左连接中的mysql搜索

mysql - 无法根据两个条件两次 JOIN 同一张表

mysql - 从 "log"表获取数据到 mySQL 查询

php - 将头像存储在mysql数据库中?

mysql - DROP DATABASE 会停止查杀进程吗?

php消息在页面之间传递查询字符串

HTML UTF-8 不同 'de facto' -字体大小

ruby-on-rails - rails 事件记录选择

php - 如何使用limit检查mysql中的数据?

php - MySQL查询和子查询