【问题标题】:MYSQL INNER JOIN where attribute does not exist for one rowMYSQL INNER JOIN,其中一行不存在属性
【发布时间】:2014-08-31 21:52:46
【问题描述】:

我有一个 Mysql 表 (CONFIGS),如下所示:

+---------+
| config  |
+---------+
| ie8     |
| Firefox |
| Chrome  |
+---------+

我有另一个表 (PROJECTS),如下所示:

+---------+----------------+--------------+
| config  | name           | passed_count |
+---------+----------------+--------------+
| Firefox | Project 1      |            0 |
| Chrome  | Project 1      |            3 |
| Chrome  | Project 2      |            1 |
| Firefox | Project 2      |            0 |
| ie8     | Project 2      |            0 |
+---------+----------------+--------------+

我希望最终结果看起来像:

+---------+----------------+--------------+
| config  | name           | passed_count |
+---------+----------------+--------------+
| Firefox | Project 1      |            0 |
| Chrome  | Project 1      |            3 |
| ie8     | Project 1      |            0 |
| Chrome  | Project 2      |            1 |
| Firefox | Project 2      |            0 |
| ie8     | Project 2      |            0 |
+---------+----------------+--------------+

基本上我希望所有项目都与所有配置相关联

| ie8     | Project 1      |            0 |

这是我要添加的另一个字段

我尝试了各种 LEFT JOINS、RIGHT JOINS,但无法使其正常工作。谁能帮帮我?

【问题讨论】:

  • 这条记录是从哪里来的? | ie8 |项目 1 | 0 |
  • 您好,欢迎您。请展示你所做的那些尝试。也许这只是一件容易解决的事情。
  • 你没有项目表吗?您拥有的当前表,实际上似乎是连接表(项目/浏览器关联)
  • | ie8 |项目 1 | 0 |因为 PROJECTS 表中的项目 1 没有 IE8。这就是我要添加到最终结果中的内容

标签: mysql sql left-join inner-join right-join


【解决方案1】:

您需要生成所有可能的组合,然后使用left join。这是一个例子:

select c.config, n.name, coalesce(p.passed_count, 0) as passed_count
from config c cross join
     (select distinct name from projects p) n left join
     projects p
     on p.name = n.name and p.config = c.config;

【讨论】:

  • 不能使用交叉连接然后按名称和配置分组吗?交叉连接应该已经生成了两个表的所有组合,还是我遗漏了什么?
  • 您好,感谢您的快速回复。让我测试一下这是否可行。
  • 谢谢@Gorgon。我忘记执行导致问题的 CROSS JOIN。
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多